2012-02-04 5 views
2

Мы пытаемся прочитать каждое слово из текстового файла и заменить его другим словом. Для небольших текстовых файлов он работает хорошо. Но для больших текстовых файлов, которые мы постоянно получаю исключение: «Строка не может быть нулевой длины имени параметра:. OldValue»Исключение «Строка не может быть нулевой длины»

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); 
Смежные вопросы