Laden...

Einzelne Strings in einer angelegten Textdatei ersetzen

Erstellt von GIBBI vor 8 Jahren Letzter Beitrag vor 8 Jahren 5.561 Views
G
GIBBI Themenstarter:in
8 Beiträge seit 2015
vor 8 Jahren
Einzelne Strings in einer angelegten Textdatei ersetzen

Hallo zusammen,

ich stehe gerade etwas auf dem Schlauch und komme auf keine gescheite Lösung.

Folgendes Programm erstellt mit dem Klick auf Button1 eine Textdatei mit 4 identischen Zeilen:


private void button1_Click(object sender, EventArgs e)
        {
            using (StreamWriter writer =
            new StreamWriter("Test.txt", true))
            {
                //Test-Protokollinhalt
                writer.WriteLine("Test123");
                writer.WriteLine("Test123");
                writer.WriteLine("Test123");
                writer.WriteLine("Test123");             
            }
        }

Ein Klick auf Button2 soll nun nur die letzte oder zum Beispiel die dritte Zeile abändern. Wie ist das Ganze realisierbar?

Ich habe es bisher nur hingekriegt mit einem string.replace alle Zeilen in „456Test“ zu ändern, aber nicht nur einzelne.


        private void button2_Click(object sender, EventArgs e)
        {
            string text = File.ReadAllText("Test.txt");
            text = text.Replace("Test123", "456Test");
            File.WriteAllText("Test.txt", text);
        }

Habt ihr eventuell eine Idee für die Umsetzung?

Vielen Dank im Voraus.

J
251 Beiträge seit 2012
vor 8 Jahren

Zeilenweise einlesen ist keine Option?

D
985 Beiträge seit 2014
vor 8 Jahren

In etwa so:


string[] lines = File.ReadAllLines("Test.txt");
lines[2] = lines[2].Replace("Test123", "456Test");
File.WriteAllLines("Test.txt", lines);

G
GIBBI Themenstarter:in
8 Beiträge seit 2015
vor 8 Jahren

Bei dem von mir hier geposteten Ausschnitt handelt es sich lediglich um ein Beispiel.

Das originale Programm testet einen Motor und legt bei einem Dauertest für jeden Testdurchlauf weitere Zeilen im Protokoll an.

Beim Starten jedes Testdurchlaufs werden zuerst die verschiedene Testschritte inklusive dem Resultat "NOT TESTED" angelegt. Dieses soll dann nach bestandenem oder fehlerhaften Test durch ein "PASSED" oder "FAILED" ersetzt werden. Es handelt sich aktuell um 4 verschiedene Testschritte pro Testdurchlauf.

Aktuell wird noch alles im Protokoll in "PASSED" geändert was absolut keinen Sinn macht, da ich den Schritt wie in meinem oben zu sehenden Beispielprogramm programmiert habe.

Die genaue Zeile welche geändert werden muss kenne ich also auch nicht, es sind aber jeweils die im letzten Testdurchlauf angelegten Zeilen.

Kann ich eventuell die Gesamtanzahl der Zeilen der Textdatei auslesen und aufgrund der immer gleich bleibenden Struktur einen Wert von der Gesamtanzahl abziehen so das ich das Ergebnis immer nur in den zuletzt durchgeführten Schritt schreibe?

Sorry für die eventuell etwas umständliche Ausdrucksweise und vielen Dank für eure Hilfe!

771 Beiträge seit 2009
vor 8 Jahren

Nach


string[] lines = File.ReadAllLines("Test.txt");

hast du in lines.Length die Zeilenanzahl stehen und kannst mit einer Schleife über die letzten Zeilen iterieren.

T
2.221 Beiträge seit 2008
vor 8 Jahren

Ohne die genaue Größe der Datei zu kennen, würde ich nicht File.ReadAllLines oder File.ReadAllText nutzen.
Wenn die Datei einige GB groß wird, knallt es beim einlesen da dir irgendwann der RAM voll läuft.
Dann solltest du ggf. die Datei zeilenweise einlesen und in eine Temp. Datei den ersetzten Inhalt schreiben.
Danach dann die original Datei löschen und die Temp. Datei umbennnen.

Aber falls die Dateien klein sind, kannst du eben auch den kurzen Weg mit File.ReadAllLines/ReadAllText nutzen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

G
GIBBI Themenstarter:in
8 Beiträge seit 2015
vor 8 Jahren

Die Größe bleibt recht überschaubar, nach einem Testtag war die Datei gerade mal 150kB groß.

Ich probiere es später aus und werde mich dann wieder melden.

T
2.221 Beiträge seit 2008
vor 8 Jahren

Alles klar.
Bei der Größe reicht File.ReadAllText/Lines locker aus 😃

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

G
GIBBI Themenstarter:in
8 Beiträge seit 2015
vor 8 Jahren

Es funktioniert jetzt mit folgendem Beispielcode:


        public void passed_speedtest()
        {
            string[] text = File.ReadAllLines(this.Name + "_" + this.Number + ".txt");
            int i = text.Length;
            text[i-4] = text[i-4].Replace("Speedtest:  NOT TESTED!", "Speedtest:  PASSED!");
            File.WriteAllLines(this.Name + "_" + this.Number + ".txt", text);
        }

Vielen Dank für die Hilfe, jetzt muss ich mir nur noch um die Protokollierung im Fehlerfall Gedanken machen. 😃

T
2.221 Beiträge seit 2008
vor 8 Jahren

Würde es nicht reichen "NOT TESTED" durch "PASSED" zu ersetzen?
Oder gehst du mit deiner Zeile aktuell davon aus, dass sich das Format ändert?
Anbei solltest du schauen ob dein Index auch so korrekt ist.
Was ist, wenn eine neue Zeile hinzukommt oder eine rausfliegt?
Dann passt dein Index nicht mehr und du musst den Fehler suchen :p

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

G
GIBBI Themenstarter:in
8 Beiträge seit 2015
vor 8 Jahren

Ja, da hast du recht. Das "NOT TESTED" durch "PASSED" zu ersetzen würde reichen.

Da der Test immer identisch abläuft und keine Zeilen rausfliegen dürfte das so passen. 😃