2012-02-04 31 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

あなたは空の文字列を取得することができます。 2つの連続した空白文字がある場所がないかどうか確認してください。 – Tudor

+1

将来、例外のスタックトレースを含め、可能であれば、例外が発生した行を指摘してください。これは通常、問題の原因を、プログラムを分析して把握しなければならない代わりに、その原因を迅速に特定します。 –

答えて

8

string.Splitを実行するときに、複数のスペースまたはタブが連続していると、空のエントリが表示されることがあります。文字列が長さ0であるため、これらは置き換えられません。

StringSplitOptions引数を使用して、空の結果を取り除き、過負荷使用:s1が空の文字列であるため、例外が発生し

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

Worked !!どうもありがとう。 –

2

これは、s1に空の文字列( "")が含まれていることを意味します。これは、ファイル内に2つの連続した空白またはタブがある場合に発生します。

4

をある時点で。あなたはこれでライン

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

を置き換えることによって、これを避けることができます:スペースで分割する際

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

:あなたはこのようなあなたのスプリットメソッドの呼び出しを変更したい

var words = line.Split(delimiterChars, StringSplitOptions.RemoveEmptyEntries); 
関連する問題