Große Datei Zeilenweise einlesen, umschreiben und speichern



  • Hi,

    ich bin noch ein ziemlicher Neuling was das Programmieren an geht und stehe nun vor volgendem Problem.
    Ich habe eine sehr große Textdatei (mehrere MB) und möchte diese nun Zeilenweise einlesen, ein Argument in jeder Zeile umschreiben, und dies dann in ein neues File schreiben.

    Wenn ich alles einfach die gesamte Textdatei in einen String packen könnte, wäre es kein Problem, was ich hier aber benötige ist wirklich dass es Zeile für Zeile ausgelesen, geändert, und dann eben in eine neue Datei angehängt wird.

    Für Tipps wie man das am besten Löst wäre ich wirklich dankbar.

    Gosti



  • Hi,

    guckst Du hier
    http://www.c-plusplus.net/forum/320142-full

    und ein Beispiel:

    static void Main(string[] args)
    {
        using (TextWriter outp = File.CreateText(@"C:\out.txt"))
        {
            using (TextReader inp = File.OpenText(@"C:\in.txt"))
            {
                string line;
                while ((line = inp.ReadLine()) != null)
                {
                    string outline = //line irgendwie verarbeiten
                    outp.WriteLine(outline);
                }
            }
        }
    
        Console.ReadKey(true);
    }
    


  • Das habe ich auch bereits gesehen, leider verstehe ich den Syntax zum Teil nicht und wüsste auch nicht wie man das in einen Buttonklick übertragen würde.

    Kannst du mir da vielleicht ein Beispiel geben wie man das in einen Buttonklick schreibt, und dass das dann in eine Datei mit bekannten Pfad schreibt?

    Dafür wäre ich wirklich dankbar.



  • Gosti schrieb:

    Das habe ich auch bereits gesehen, leider verstehe ich den Syntax zum Teil nicht und wüsste auch nicht wie man das in einen Buttonklick übertragen würde.

    Kannst du mir da vielleicht ein Beispiel geben wie man das in einen Buttonklick schreibt,

    Du kopierst alles bis auf die 1. Zeile in deinen "Buttonklick"?

    und dass das dann in eine Datei mit bekannten Pfad schreibt?

    Was heisst "mit bekannten Pfad"?

    Und grundsätzlich: Die Grundlagen musst du schon selbst lernen, dafür ist das Forum nicht da.



  • Wie wärs mit:

    using System.IO;
    const string FileName = "datei.txt";          // Konstanten String mit Dateiname anlegen
    string[] lines = File.ReadAllLines(FileName); // Array für die Zeilen anlegen und Datei einlesen
    string[] newLines = new string[lines.Length]; // Array für die bearbeiteten (-> neuen) Zeilen anlegen
    for (int i = 0; i < lines.Length; i++)        // Schleife, die so oft wiederholt wird wie Items (-> Zeilen) im ersten Array sind
        newLines[i] = lines[i].ToUpper();         // Wert "umschreiben" und dem entsprechenden Item des Arrays zuweisen
    File.WriteAllLines(FileName, newLines);       // Array mit den neuen Zeilen in Datei schreiben.
    

    oder ein prinzipiell gleicher Lösungsansatz ein bischen anders umgesetzt:

    using System.IO;
    string FileName = "datei.txt";                    // Konstanten String mit Dateiname anlegen
    List<string> newLines = new List<string>();       // Liste für die neuen Zeilen anlegen
    for (string line in File.ReadAllLines(FileName))  // foreach-Schleife für jede Zeile in der Datei wiederholen
        newLines.Add(line.ToUpper());                 // Wert "umschreiben" und der Liste mit den neuen Zeilen hinzufügen
    File.WriteAllLines(FileName, newLines);           // Liste mit den neuen Zeilen in Datei schreiben.
    

    Und zum Thema mit dem Button-Click und dem main:
    `void main ist die Standard-Methode ("Einstiegspunkt") einer jeden Anwendung.

    Wenn du dir in deinem Projekt die Datei program.cs ansiehst wirst du genau das finden. Von dort wird dann Application.Run() aufgerufen und eine neue Instanz deiner Form1 übergeben. Beim erstellen der neuen Instanz wird dann das aufgerufen, was im Code deiner Form unter public <FormName>() steht ausgeführt. Das ist im Normalfall InitializeComponent(). Diese Methode befindet sich wiederum in der <FormName>.designer.cs. Wenn du dort rein gehst siehst du in der genannten Methode, wie die ganzen Controls instanziert, die Eigenschaften angepasst und die Controls hinzugefügt werden. Dort wiederum ist bei den Buttons jeweils die Zeile this.<ButtonName>.Click += new EventHandler(this.<ButtonName>_Click);, was bedeutet, dass mit dem ClickEvent ein Eventhandler und damit verbunden die Methode <ButtonName>_Click verknüpft wird. Diese findest du wieder zurück in der <FormName>.cs und kannst dann zwischen den {} Klammern beliebigen Code einfügen. In dem Fall müsstest du also einfach den Inhalt aus der main() dazwischen einfügen.

    Außerdem ist zu beachten, dass Console.ReadKey(); ein Konsolen-Befehl ist und daher entfernt werden sollte.`

    **Ich hoffe ich konnte dir halbwegs darlegen, wie ein VS-Projekt in C# strukturiert ist und mit deinem Problem weiterhelfen.

    Liebe Grüße, Darius.**



  • Gosti schrieb:

    Hi,

    ich bin noch ein ziemlicher Neuling was das Programmieren an geht und stehe nun vor volgendem Problem.
    Ich habe eine sehr große Textdatei (mehrere MB) und möchte diese nun Zeilenweise einlesen, ein Argument in jeder Zeile umschreiben, und dies dann in ein neues File schreiben.

    Wenn ich alles einfach die gesamte Textdatei in einen String packen könnte, wäre es kein Problem, was ich hier aber benötige ist wirklich dass es Zeile für Zeile ausgelesen, geändert, und dann eben in eine neue Datei angehängt wird.

    Für Tipps wie man das am besten Löst wäre ich wirklich dankbar.

    Gosti

    Das ist kein Problem.

    Du öffnest die erste Datei (zum Lesen), legst eine neue Datei an (zum Schreiben) und arbeitest die Datensätze ab.
    Fehlerbehandlung hier mal weggelassen, ob Datei 1 überhaupt existiert bzw. geöffnet werden kann oder Daten enthält oder Dateiname falsch etc.:

    Schleife do

    Lies 1 Datensatz aus Lesedatei
    Bearbeite Datensatz;
    Schreibe Datensatz in Schreibedatei

    Schleife while (! Dateiende Lesedatei)

    // Abbruchbedingung hier am Schluß, do..while, weil nach dem Lesen des letzten Datensatzes würde das Dateiende erreicht sein.

    Das war´s. Sozusagen ein Dreizeiler.

    Pascal



  • @pascal2009
    Das wurde genau so schon beantwortet. Abgesehen davon, dass eine while-Schleife angebrachter ist als eine do-While-Schleife. Dein Pseudocode raucht bei leerer Datei ab.


Log in to reply