2012-02-04 927 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 2012-02-04 14:02:17

+1

將來,請包含異常的堆棧跟蹤,並且如果可能,請指出引發異常的行。這通常可以快速識別問題的根源,而不是讓人們分析程序來搞清楚。 – 2012-02-04 14:27:28

回答

8

當您執行string.Split時,如果順序存在多個空格或製表符,則可能會獲得空條目。由於字符串長度爲0,因此不能替換它們。

使用這條使用StringSplitOptions參數空的結果超載:

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

工作!非常感謝。 – 2012-02-04 14:04:14

2

這意味着s1包含一個空字符串(「」),如果您的文件中有兩個連續的空格或製表符,就會發生這種情況。

4

你想改變你這樣的拆分方法調用:

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

出現異常是因爲s1是一個空字符串在某一點。你可以通過這個替換線

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

避免這種情況:

String[] words = line.Split(delimiterChars, StringSplitOptions.RemoveEmptyEntries); 
相關問題