2017-08-30 15 views
0

Ich möchte eine Textdatei Zeile für Zeile lesen und eine bestimmte Zeile bearbeiten. So habe ich die Textdatei in ein String-Variable setzen wie:C# Textdatei Zeile für Zeile lesen und bestimmte Zeile bearbeiten

string textFile = File.ReadAllText(filename);

Meine Textdatei ist wie:

Line A 
Line B 
Line C 
Line abc 
Line 1 
Line 2 
Line 3 

Ich habe eine bestimmte Zeichenfolge (= "abc"), die ich möchte in dieser Textdatei suchen. Also, ich lese die Zeilen, bis die Zeichenfolge finden und gehe in der dritten Zeile („Linie 3“ -> diese Zeile ist immer anders) nach diesem gefunden string:

string line = ""; 
string stringToSearch = "abc"; 

using (StringReader reader = new StringReader(textFile)) 
    { 
     while ((line = reader.ReadLine()) != null) 
     { 
      if (line.Contains(stringToSearch)) 
       { 
       line = reader.ReadLine(); 
       line = reader.ReadLine(); 
       line = reader.ReadLine(); 

       //line should be cleared and put another string to this line. 
       } 
     } 
    } 

Ich mag die dritte Lesezeile löschen und legen Sie eine weitere Zeichenfolge in diese Zeile und speichern Sie die gesamte "Zeichenfolge" in "Textdatei".

Wie kann ich das tun?

+0

Dies könnte helfen: [File.ReadAllLines] (https: //msdn.mic rosoft.com/de-de/library/system.io.file.readalllines(v=vs.110).aspx). Verwenden Sie dies, durchlaufen Sie alle Zeilen, ersetzen Sie die Zeile, die Sie ersetzen möchten, und schreiben Sie dann in die ursprüngliche Datei zurück. –

Antwort

1

können Sie speichern die Inhalte in einem StringBuilder wie folgt aus:

StringBuilder sbText = new StringBuilder(); 
using (var reader = new System.IO.StringReader(textFile)) { 
    while ((line = reader.ReadLine()) != null) { 
     if (line.Contains(stringToSearch)) { 
      //possibly better to do this in a loop 
      sbText.AppendLine(reader.ReadLine()); 
      sbText.AppendLine(reader.ReadLine()); 

      sbText.AppendLine("Your Text"); 
      break;//I'm not really sure if you want to break out of the loop here... 
     }else { 
      sbText.AppendLine(line); 
     } 
    } 
} 

und es dann wie folgt schreiben zurück:

using(var writer = new System.IO.StreamWriter(@"link\to\your\file.txt")) { 
    writer.Write(sbText.ToString()); 
} 

Oder wenn Sie wollen es einfach in der Zeichenfolge speichern textFile Sie kann es so machen:

textFile = sbText.ToString(); 
+0

Vielen Dank! Dies scheint der richtige Ansatz zu sein. Jetzt habe ich nur das Problem, einen Fehler beim Schreiben der Zeichenfolge zurück in die Zeichenfolge "TextFile" zu haben. "Illegal char im Pfad" für die folgende Zeile: 'using (var writer = new System.IO.StreamWriter (Textdatei)) {' – Giovanni19

+0

@ Giovanni19: Mein Fehler, "TextFile" sollte sein "Link zu Ihrer Textdatei Sie möchte schreiben ". Ich sehe, dass Sie die Variable in Ihrem Beitrag anders verwendet haben. Wenn Sie es einfach als String in 'textFile' speichern wollen, können Sie folgendes verwenden:' textFile = sbText.ToString() '. Ich habe die Antwort aktualisiert. – waka

+0

Danke. Dies fügt jedoch die neue Zeile zu der Zeile hinzu, die z. die Zeichenfolge "abc". Ich möchte die neue Zeile der dritten Zeile nach der Zeichenfolge "abc" hinzufügen. – Giovanni19

0

Schreiben Sie die gesamte Datei wieder wäre einfacher:

string old = "abc"; 
string nw ="aa"; 
int counter = 0; 

    Using(StreamWriter w =new StreamWriter("newfile"); 
    foreach(string s in File.ReadLines(path)) 
    { 
     if (s = old) 
     { 
       w. WriteLine(nw); 
     } 
     else 
     { 
       w. WriteLine(s); 
     } 
     counter ++; 
    } 
+1

Jetzt wird die Zeile 'abc' ersetzt, was das OP nicht wollte. Auch 'new' ist ein Schlüsselwort und kann nicht als Variablenname verwendet werden. – waka

0

Sie wahrscheinlich etwas wollen, werden wie folgt aus:

DirectoryInfo di = new DirectoryInfo(Location); 
FileInfo[] rgFiles = di.GetFiles("txt File"); 

foreach (FileInfo fi in rgFiles) 
{ 

    string[] alllines = File.ReadAllLines(fi.FullName); 


    for (int i = 0; i < alllines.Length; i++) 
    { 
     if (alllines[i].Contains(stringToSearch)) 
     {       
      alllines[i] = alllines[i].Replace(stringToSearch, some value); 
     } 
    } 
} 

diese Weise werden Sie die Textdatei Zeile für Zeile, bis die liest Ende des Dokuments und wenn der Wert übernommen wird, wird er durch den neuen Wert ersetzt.

+0

Das ist nicht, was ich will:/Siehe meinen ersten Beitrag. – Giovanni19

+0

@ Giovanni19, Sie möchten ein Dokument Zeile für Zeile lesen und einen Wert aktualisieren (wenn es gefunden wird), dann möchten Sie diesen Wert aktualisieren? Ich habe recht? Dieser obige Code wird dafür funktionieren .... Möchtest du eine neue Version dieses Dokuments speichern? – MrMime

Verwandte Themen