Waisen suchen



  • Hallo,
    ich will das Rad nicht noch einmal entdecken.
    Ich habe eine große Textdatei mit mehreren tausenden Zeilen,
    In manchen Zeilen steht nur ein Wort. Nun möchte ich die Waisen
    an die vorherigen Zeilen anhängen.
    Wie gehe das am besten an:
    Die Waisen kann ich einfach in eine zweite Datei kopieren, aber
    wie geht es dann weiter? Gibt es bereits eine fertige Lösung?
    Ich verwende qt5 und Kubuntu.
    wado



  • Hallo,

    auf anhieb würde ich Programmintern eine Liste vom Typ String verwenden.

    Anschließend in einer Schleife per ReadAllLines Methode der File-Klasse alle Zeilen durchgehen. Zeilen in denen Leerzeichen vorhanden sind, werden der Liste hinzugefügt. Zeilen ohne Leerzeichen werden dem letzten Element der Liste angefügt.

    Am Schluss wird das ganze noch gespeichert und du solltest keine Waisen mehr im Dokument haben.

    In Pseudocode als etwa sowas:

    var rowList;
    
    für alle Zeilen in Textdatei
        Zeile enthält Leerzeichen?
              Zeile zu rowList hinzufügen
        Zeile enthält keine Leerzeichen?
              rowList[letzterIndex] Wert der Zeile zuweisen
    Ende für alle
    
    Schreibe rowList in Textdatei
    

    // EDIT:
    Der beschriebene Ansatz funktioniert nur mit C++/CLI, solltest du also mit reinem C++ arbeiten musst du den Weg entsprechend anpassen.



  • Danke,
    manchmal sieht man den Wald...
    auf den letzten Index bin ich nicht gekommen
    wado



  • Ich würde einfach die Datei zeichenweise kopieren. Sobald ein Zeilenumbruch erreicht wird, merk ich mir dessen Position und suche weiter bis ein Leerzeichen oder der nächste Zeilenumbruch erreicht wird. Finde ich ein Leerzeichen, schreibe ich einen Zeilenumbruch, geh zurück zum ersten Zeichen nach dem zuletzt gefundenen Zeilenumbruch und fahre von dort mit der selben Prozedur fort. Finde ich auf meiner Suche einen Zeilenumbruch, bevor ich ein Leerzeichen finde, tu ich genau das gleiche, schreib aber keinen Zeilenumbruch.

    Vorteil: Muss nicht erstmal die ganze Datei in den Speicher kopieren, funktioniert auch mit Dateien, die nicht in den Speicher passen...



  • das sieht dann in QT so aus:

    int vvar;
    QString stinr;
    for (int i = 0; i < zeilenTxt.size(); ++i){
        eineZeile =  zeilenTxt.at(i);
        if (!eineZeile.isEmpty()){
            if(eineZeile.contains('#')){
                temp = eineZeile ;
            }
            if (!eineZeile.contains(' ') && !eineZeile.contains('#')&& !eineZeile.contains(':')){
    
                wort += stinr +";" + temp + ',' + eineZeile +  '\n';
            }
         }
        stinr ="";
        stinr.append(QString("%1").arg(vvar));
        vvar =vvar *1+1;
    }
    

Anmelden zum Antworten