Datei einlesen und die Daten ordnen



  • Hallo Leute,

    ich habe lange überlegt und rum probiert wie ich folgendes machen kann.

    Ich leses eine TXT Datei ein. In dieser Datei können bis zu 1000 auch mehr Zeilen drin sein. Jetzt muss ich jede einzelne Zeile durchgehen und nach bestimmten Wörtern suchen. Wenn bestimmte Wörter gefunden sind muss ich in den drauffolgenden Zeilen Zahlen auslesen und in Array abspeicher.

    Bisher habe ich es folgedermaße versucht.

    1. Über Memo und RichEdit:
    Ich habe die Daten in RichEdit (Memo) eingelesen und habe dann damit gearbeitet.
    Leider hat RichEdit irgendwie immer mehr Zeilen gehabt als es in der Textdatei drin war, daher kamen viele Berechungen total durcheinader.

    2. Ich habe mit fstream sprich rein über c++ gemacht
    Ich habe über getline versucht, hat mir auch sehr gut gefallen, da es alles im Hintergrund abllief. Leider habe ich kein Befehl gefunden wo ich sagen kann, jetzt gehst du in den file, in die Zeile 12 und holst ab der Stelle 4 die Zahl mit der Länge 4. Gibt es so ein Befehl?

    Was denkt Ihr welches verfahren ist besser? Oder sind beide für sowas schlecht? Was könnt Ihr dann vorschlagen?

    Gruß Stefan


  • Mod

    Hallo

    vermutlich ist TStringList besser geeignet

    Mfg
    Klaus



  • Hallo

    Leider habe ich kein Befehl gefunden wo ich sagen kann, jetzt gehst du in den file, in die Zeile 12 und holst ab der Stelle 4 die Zahl mit der Länge 4. Gibt es so ein Befehl?

    Und auch mit TStringList gibt es keinen solchen Befehl. (Befehle gibts in C++ gar nicht, nur Funktionen) Du must das also auf Basis der String-Methoden schon selber programmieren. Passend wäre da String::SubString.

    bis bald
    akari

    /Edit : Tag korrigiert



  • Bin prinzipiell für Ansatz zwei, da er portabel ist.
    Genauso prinzipiell unmöglich ist es, ohne weitere Informationen an eine beliebige (durch Zeile und Spalte identifizierte) Position einer Textdatei zu springen, es sei denn, alle Zeilen haben die gleiche Länge.
    Kannst du nicht schon während des Einlesens die Datei analysieren ohne dass du die ganze Datei zuerst in den Speicher lädst und dann analysierst?



  • @DocShoe
    wie meinst du das? HAst du vielleicht ein Beispiel?



  • Na, du liest halt eine Zeile ein, untersuchst sie und wenn sie ein bestimmtes Kriterium erfüllt liest du die nächste Zeile ein und wertest sie aus:

    #include <string>
    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main()
    {
       ifstream ifs( "c:/meinedatei.txt" );
       string line;
    
       // Datei zeilenweise lesen
       while( getline( ifs, line ) )
       {
          // aktuelle Zeile analysieren, wenn das Kriterium erfüllt
          // ist wird die nächste Zeile gelesen und ausgewertet
          if( meets_condition( line ) && getline( ifs, line ) )
          {
             // Substring von Position 4-10 ermitteln
             string data = line.substr( 4, 6 );
    
             // irgendwas mit diesem Substring anfangen
          }   
       }
    }
    

    Damit musst du nicht die ganze Datei auf einmal in den Speicher laden, sondern kannst sie zeilenweise auswerten. Obwohl moderne Systeme mit 1000 Zeilen nicht die geringsten Probleme haben sollten, wenn du alles auf einmal in den Speicher lädst.


Anmelden zum Antworten