C# Zeilen in Textdatei überschreiben

hubertus1990

Lt. Commander
Registriert
Sep. 2005
Beiträge
1.384
Hi Leute.

Ich habe folgendes Problem:
Ich bekomme es einfach nicht hin, das mein selbsgebasteltes Programm bestimmte Einträge aus einer Textdatei überschreibt.

Die Werte in meiner Textdatei sind wie folgt zeilenweise aufgelistet:

beispieltext1
beispieltext2
beispieltext3
beispieltext4
usw...

Wie funktioniert es nun, dass ich eine einzelne Zeile meiner Textdatei (zB. die Zeile mit beispieltext3) durch einen anderen Text ersetze? Also das vorher Dortgestandene überschreibe?

lg Phil

EDIT: Ich bin was C# betrifft nicht total auf den Kopf gefallen, mir braucht also niemand erklären dass ich dafür einen StreamReader bzw. Writer brauche
Ich bräuchte lediglich eine erklärung für diesen einen Arbeitsschritt!
 
Zuletzt bearbeitet:
also es ist mir gelungen den string zu suchen, also die zeile zu finden
allerdings wird ann dur sw.writeline immer nur eine zeile unten angehängt, allerdings nichts ersetzt!
 
Naja, ich meinte auch eher, dass du den String als ganze Kette lesen laesst und in ein Array von Strings oder einen ganzen String packst, dort ersetzt, und das ganze danach mit sw.write in die Datei schreibst. Ich kann kein C#, nur Java. Aber das Prinzip sollte dasselbe sein, so wie die Moeglichkeiten.

Also irgendwie sowas wie String a = ""; String b[] = ""; int i = 0; while(a = sr.readLine() != null) { b=a;i++ } for(int i = 0;i<b.length;i++) { if(b.equalsIgnoreCase("SUCHDENSTRINGLOL")) b="neuerstringlulz"; } sw.write(b);
 
Zuletzt bearbeitet:
gut, bleibt aber immer noch das problem dass dadurch die alten einträge nicht gelöscht werden!
 
ok, ich erklärs nochmal.
die ganze sache sollte so aussehen:

ausgangssituation:

textinzeile1
textinzeile2
textinzeile3 (dieser zB sollte gelöscht und dann ersetzt werden)
textinzeile4
usw...

nun wird mit dem klick auf einen button die zu erstetzende zeile gesucht (dies funktioniert bereits!)
danach wird der text in dieser zeile mit einem anderen text ersetzt

das ergebnis sollte dann so aussehen:
textinzeile1
textinzeile2
geändertertext
textinzeile4
usw...

derzeit sieht es bei mir allerdings so aus:

textinzeile1
textinzeile2
textinzeile3ersetzendertext
textinzeile4
usw...

sprich, zeile 3 wird nicht gelöscht sondern es wir durch sr.WriteLine einfach der andere text darangehängt.
 
du kannst byte-weise den text ersetzen, das ganze gibt aber natürlich wieder neue probleme...


Stream s = File.OpenWrite("test.txt");
s.WriteByte((byte)'B');
s.Close

allerdings glaub ich ist

string[] ar =File.ReadAllLines("test.txt");

ar[5] = "test";

File.WriteAllLines("test.txt", ar);

einfacher ^^
 
String.Replace:
http://msdn.microsoft.com/en-us/library/system.string.replace.aspx

Was du also machst ist folgendes:

  1. Ganze Datei in einen String einlesen
  2. Im String per String.Replace (s.o.) die gewünschte Ersetzung vornehmen
  3. Den String wieder in die Datei schreiben

Beispiel:

test.txt:
Code:
eine zeile
eine andere zeile
und noch eine zeile
replace.cs:
Code:
using System;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            String dateiPfad = "D:\\test.txt";

            StreamReader inputStreamReader = File.OpenText(dateiPfad);
            String Inhalt = inputStreamReader.ReadToEnd();
            inputStreamReader.Close();

            String ersetzen = "eine andere zeile";
            String durch = "eine veränderte zeile";

            Inhalt = Inhalt.Replace(ersetzen, durch);

            StreamWriter outputStreamWriter = File.CreateText(dateiPfad);
            outputStreamWriter.Write(Inhalt);
            outputStreamWriter.Close();
        }
    }
}

test.txt danach:
Code:
eine zeile
eine veränderte zeile
und noch eine zeile
Das zumindest ist die einfache und für den Normalfall vernünftige Variante. Sollte bei normalen Textdateien problemlos funktionieren.
 
Zuletzt bearbeitet:
du musst unter eine bedingung die Datei aufmachen, nähmlich, Trancute. Dabei wird der ganzer inhalt der datei geleert.
 
@backslash: danke das habe ich gesucht! problem gelöst!
 
Es gibt da zwei schöne Funktionen, die für genau solche Aufgabe gedacht sind:
System.IO.File.ReadAllText bzw. WriteAllText

In VB.NET schaut das dann so aus (übersetzen in C# kannst du das hoffentlich selbst):

Dim Lines() as String = System.IO.File.ReadAllText(FileName).Split(New String(){vbCr,VbLf,VbCrLf},RemoveEmptyEntries)
Lines(3) = "Neuer Text"

Dim Output as String=""
For each Line in Lines
Output &= Line & vbCrLf
Next

System.IO.File.WriteAllText(FileName,Output,False)

Bei größeren Dateien wird das wegen der ständigen Stringverkettungen langsamer werden, aber bei kleineren Dateien ist das garantiert schneller, da man nicht jede Zeile einen Context Switch machen muss. Beim Einlesen sogar jedes Byte, wenn man keinen Buffered Reader/Writer verwendet.
 
Zurück
Oben