Parser für Textdateien



  • Danke für den Tipp, klappt wunderbar 🙂

    Aber jetzt stehe ich vor einem weiterem Problem: ich habe die Dateinamen in einer seperaten Datei
    gespeichert, aber leider sind viele Dateien doppelt aufgelistet, da sie in der ursprünglichen Datei
    auch mehrmals vorkommen. Wie kann ich die Duplikate in der neuen Textdatei finden und löschen?



  • Wiederum auslesen, am besten in einem std::vectorstd::string speichern. Nach doppelten Werten suchen, diese aus dem vector rauslöschen und dann wieder in die Datei zurückschreiben. Hier sind beispiele für std::vector<T>



  • So z. B.:

    fstream                  FileList ("MyList.ini", fstream::in | fstream::out);
    vector <string>          TempOldFileContents;
    vector <string>          TempNewFileContents;
    string                   TempLine;
    vector<string>::iterator Loop_0      = 0;
    vector<string>::iterator Loop_1;
    vector<string>::iterator Loop_2      = 0;
    bool                     Contains;
    
    while ( ! FileList.eof() )
    {
        getline (FileList, TempLine);
        TempOldFileContents.insert (iLoop++, TempLine);
    }
    
    for ( Loop_0 = TempOldFileContents.begin () ; 
          Loop_0 = TempOldFileContents.end    (); Loop_0++ )
    {
        Loop_1 = Loop_0;
        Loop_1++;
        Contains = false;
        while ((Loop_1 < TempOldFileContents.end) && (Contains == false))
        {
            if (TempOldFileContents [Loop_0] == TempOldFileContents [Loop_1])
                Contains = true;
            else
                Loop_1++;
        }
        if (Contains == false)
            TempNewFileContents.insert (Loop_2++, TempOldFileContents [Loop_0]);
    }
    
    FileList.close ();
    FileList.open ("MyList.ini", fstream::trunc);
    
    for ( Loop_0 = TempNewFileContents.begin () ; 
          Loop_0 = TempNewFileContents.end    (); Loop_0++ )
        FileList << TempNewFileContents [Loop_0]
    
    FileList.close ();
    

    In Realita wuerde ich noch ein paar Check-Ups dazwischen legen.



  • hartmut1164 schrieb:

    ...

    Oder einfach std::unique_copy benutzen...



  • Firefighter schrieb:

    Wiederum auslesen, am besten in einem std::vectorstd::string speichern. Nach doppelten Werten suchen, diese aus dem vector rauslöschen und dann wieder in die Datei zurückschreiben. Hier sind beispiele für std::vector<T>

    Oder einfach in ein std::set stopfen, da fallen Duplikate dann automatisch raus.



  • Stimmt, der filtert die Duplikate automatisch raus, danke pumuckl.



  • boost::spirit?!



  • Vielen Dank für die Antworten, habe alles mal ausprobiert, doch dann bin ich auf eine ganz
    einfache Lösung gekommen: Die Dateinamen in der Liste alphabetisch sortieren, und dann
    prüfen, ob "zeile-1 = zeile" ist, wenn nicht, die jeweilige Zeile in eine Datei schreiben. Ist zwar
    nicht so elegant wie die hier genannten Lösungen, jedoch sehr einfach machbar (für einen
    N00b wie mich) und effektiv.

    Nun stehe ich jedoch vor einem weiteren Problem. Das Programm liefert mir eine Liste mit
    Dateinamen und befindet sich in dem Ordner, in dem auch die auf der Liste befindlichen
    Dateien sind. Jeder Dateiname auf der Liste hat eine Nummer (1-5) gefolgt von einem
    Doppelpunkt am Anfang.

    Ist es möglich, Ordner mit den Nummern (1-5) zu erstellen und die jeweiligen Dateien
    in diese zu Verschieben?

    Berspiel:

    Die Generierte Datei:

    1:setup.hlp
    1:setup.txt
    2:keyboard.drv
    3:olibw.drv
    4:SOL.HLP
    4:SQUARES.BMP
    4:SSSTARS.SCR
    5:HIMEM.SYS
    5:ROMAN.FON
    

    Dateien sollen verschoben werden nach:

    setup.hlp ----> Ordner "1"
    setup.txt ----> Ordner "1"
    keyboard.drv ----> Ordner "2"
    olibw.drv ----> Ordner "3"
    SOL.HLP ----> Ordner "4"
    SQUARES.BMP ----> Ordner "4"
    SSSTARS.SCR ----> Ordner "4"
    HIMEM.SYS ----> Ordner "5"
    ROMAN.FON ----> Ordner "5"



  • Daniel89 schrieb:

    Ist zwar nicht so elegant wie die hier genannten Lösungen, jedoch sehr einfach machbar (für einen
    N00b wie mich) und effektiv.

    Die vorgeschlagenen Lösungen mit std::set oder std::unique_copy sind genauso einfach, wenn der NOOb sich ne halbe Stunde Zeit nimmt und sich etwas Doku dazu durchliest (die er früher oder später eh lesen muss), und mindestens genauso effektiv.

    Daniel89 schrieb:

    Ist es möglich, Ordner mit den Nummern (1-5) zu erstellen und die jeweiligen Dateien in diese zu Verschieben?

    Ja, ist möglich.

    Achso, du willst wissen wie? (War zwar nicht die Frage, aber wir sind mal nicht so...)

    mkdir 1; mv setup.hlp 1; mv setup.txt 1;
    

    Achsoo, du willst wissen wie das mit C++ geht? (War zwar erst recht nicht die Frage, aber naja, vielleicht stellst du die nächste Frage etwas genauer ;))
    Da gibts verschiedene Möglichkeiten. Unter Windows hat die WinAPI Funktionen für Verzeichnis- und Dateimanipulationen. Die Boost-Bibliotheken enthalten boost::filesystem wo solche operationen plattformunabhängig angeboten werden. Das WinAPI-Forum bzw. ein google nach boost::filesystem kann dir da genaueres sagen...



  • Danke für all die Antworten & Tipps, das Programm funktioniert nun so wie gewünscht 🙂


Anmelden zum Antworten