2016-06-21 5 views
0

この質問は、過去の議論の続きです。HEREです。だから今私は自分のテキストファイルのすべての行を読み込み、特定の列の正確な文字列も読み込むことができました。今私の問題は、別の文字列値を持つタブベースファイルのColumn(4)のテキスト値を変更したいということです。 はたとえば、元のファイルは、このようなものです:Cのタブベースのテキストファイルのテキストの変更/置換

ID1 25 800 Low 
ID2 25 700 Low 
ID3 25 600 Low 

は、私が変更したい:

ID1 25 800 High 
ID2 25 700 High 
ID3 25 600 High 

...ここに私の完全なコードです。私はあなたの助けに感謝します。

string route = @"C:\MyFile.txt"; 
FileStream fileStream2 = new FileStream(route, FileMode.Open); 

var m_readFile2 = new StreamReader(fileStream2); 
var m_writeFile2 = new StreamWriter(fileStream2); 

     string[] colArr1 = new string[100]; 
     string[] colArr2 = new string[100]; 
     string[] colArr3 = new string[100]; 
     string[] colArr4 = new string[100]; 
     int arrcount = 1; 

     while ((line = m_readFile2.ReadLine()) != null) 

     { 

      string col1 = ""; 
      string col2 = ""; 
      string col3 = ""; 
      string col4 = ""; 

       col1 = line.Split('\t')[0]; 
       col2 = line.Split('\t')[1]; 
       col3 = line.Split('\t')[2]; 
       col4 = line.Split('\t')[3]; 

       colArr1[arrcount] = col1; 
       colArr2[arrcount] = col2; 
       colArr3[arrcount] = col3; 
       colArr4[arrcount] = col4;  


       m_writeFile2.WriteLine("Serv" + arrcount + "\t" + "25" + "\t" + "400" + "\t" + "High"); 
       arrcount = arrcount + 1; 

答えて

1

私はあなたが配列に行を分割示唆して戻って一緒に新しい行を置く:

 string source = @"D:\MyFile.txt"; 
     string destination = @"D:\MyFile2.txt"; 

     int columnToChange = 3; 
     string newValueForColumn = "High"; 

     using (FileStream sourceStream = new FileStream(source, FileMode.Open)) 
     { 
      using (FileStream destinationStream = new FileStream(destination, FileMode.CreateNew)) 
      { 

       using (StreamReader sourceReader = new StreamReader(sourceStream)) 
       { 

        using (StreamWriter destinationWriter = new StreamWriter(destinationStream)) 
        { 
         string oldLine = string.Empty; 
         while ((oldLine = sourceReader.ReadLine()) != null) 
         { 
          string[] values = oldLine.Split('\t'); 
          StringBuilder newLine = new StringBuilder(); 
          if (values.Length > columnToChange) 
          { 
           values[columnToChange] = newValueForColumn; 
           for (int i = 0; i < values.Length; i++) 
           { 
            newLine.Append(values[i]); 
            if (i + 1 < values.Length) 
            { 
             newLine.Append('\t'); 
            } 
           } 
          } 
          else 
          { 
           newLine.Append(oldLine); 
          } 

          destinationWriter.WriteLine(newLine.ToString()); 
         } 
        } 
       } 
      } 
     } 

     // File.Delete(source); 
     File.Move(source, source + ".bak"); 
     File.Move(destination, source); 
    } 
+0

'stringbuilder'が文字列 – Eldho

+0

Iを追加するための最良の選択肢であります配列文字列に完全な新しい行を作成しました。これは単純なテキストファイルです。しかし、私はWriteLineメソッドを使用する場合、テキストファイルは、次のようになり、変更されますが、余分な行を追加していない: ServID1 25 800低 ServID2 25 700低 ServID3 25 600 LowServID1 25 800ハイ ServID2 25 700ハイ しかし、私はしたいですテキストを変更して余分な行を追加することはありません:-( – zakim

+0

あなたは同じファイルに書き戻しています。新しいファイルにすべてのnewLinesを書き込む必要があります。完了したら、両方のファイルを閉じて古いものを削除し、新しい名前を古い名前に変更してください –

1

KISS

string text = File.ReadAllText(route); 

text = text.Replace("Low", "High"); 

File.WriteAllText(route, text); 
+0

私はすべてのニーズを満たしていないことを恐れています。別の列に「低」も含まれている場合はどうなりますか?それは置き換えてはいけません。私はあなたのアプローチが "単純で愚かな"ものだと思っています;-) –

+1

@ThomasVoß - すべてが可能です...しかし、提供されたコードは要件を正確に満たしています。要件が他の場合 - 別のコードがあります。 [YAGNI](https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it)。 –

+0

基本原則を思い出していただきありがとうございます。あなたはまったく正しい。だから今、両方の要件のための解決策があります... –

関連する問題