2012-02-04 3 views
2

텍스트 파일에서 각 단어를 읽고 다른 단어로 바꾸려고합니다. 작은 텍스트 파일의 경우 잘 작동합니다. 그러나 더 큰 텍스트 파일을 우리는 예외가 계속 ". 문자열 길이가 0 매개 변수 이름이 될 수 없습니다 oldValue입니다"예외 "문자열의 길이는 0이 될 수 없습니다."

void replace() 
    { 
     string s1 = " ", s2 = " "; 
     StreamReader streamReader; 
     streamReader = File.OpenText("C:\\sample.txt"); 
     StreamWriter streamWriter = File.CreateText("C:\\sample1.txt"); 
     //int x = st.Rows.Count; 
     while ((line = streamReader.ReadLine()) != null) 
     { 
      char[] delimiterChars = { ' ', '\t' }; 
      String[] words = line.Split(delimiterChars); 
      foreach (string str in words) 
      { 
       s1 = str; 
       DataRow drow = st.Rows.Find(str); 
       if (drow != null) 
       { 
        index = st.Rows.IndexOf(drow); 
        s2 = Convert.ToString(st.Rows[index]["Binary"]); 
        s2 += "000";           
        // Console.WriteLine(s1); 
        // Console.WriteLine(s2); 
        streamWriter.Write(s1.Replace(s1,s2)); // Exception occurs here 
       } 
       else 
        break; 
      } 
     } 
     streamReader.Close(); 
     streamWriter.Close(); 
    } 

우리는 그 이유를 찾을 수 없습니다. 미리 감사드립니다.

+0

당신은 빈 문자열을 받고 할 수있다. 두 개의 공백 문자가있는 곳이 없는지 확인하십시오. – Tudor

+1

나중에 예외의 스택 추적을 포함하고 가능한 경우 예외가 발생한 줄을 지적하십시오. 이는 대개 사람들이 프로그램을 분석하여 알아 내야하는 대신 문제의 원인을 신속하게 식별합니다. –

답변

8

string.Split을 수행 할 때 순서대로 공백이나 탭이 여러 개 있으면 빈 항목이 나타날 수 있습니다. 문자열은 길이가 0이므로이 값을 바꿀 수 없습니다.

빈 결과가 StringSplitOptions 인수를 사용하여 제거합니다 과부하 사용 :이처럼 분할 메서드 호출을 변경하려면

var words = line.Split(delimiterChars, StringSplitOptions.RemoveEmptyEntries); 
+0

일했습니다! 고마워. –

2

즉, 파일에 두 개의 연속 된 공백 또는 탭이 있으면 s1에 빈 문자열 ("")이 포함될 수 있습니다.

4

을 :

String[] words = line.Split(delimiterChars,StringSplitOptions.RemoveEmptyEntries); 
5

s1 빈 문자열이기 때문에 예외가 발생합니다 어떤 시점에서. 이와 함께 라인

String[] words = line.Split(delimiterChars); 

을 대체하여이 문제를 방지 할 수 있습니다 공간으로 분할 할 때

String[] words = line.Split(delimiterChars, StringSplitOptions.RemoveEmptyEntries); 
관련 문제