Vergleich von zwei Textdateien/Stücklisten



  • Hallo zusammen,

    ich hab da ein kleines Problem und da mir die Suche leider nicht weitergeholfen hat poste ich mal mein Prob.

    Ich hab zwei Textdateien, in beiden sind Einträge vorhanden wie bei einer Stückliste sieht in etwa wie foglt aus:

    A34 34-556
    C16 23-555
    G456 57-886

    habs auch schon geschafft beide in zwei String-Arrays zu laden, jetzt gehts darum das eine Textdatei eine aktuelle Liste darstellt und die andere eine veralterte, ich brauch nun ein Programm um den vergleich anzustellen: a)welche einträge sind bei aktueller dazu gekommen b)welche Einträge sind in aktueller nicht mehr vorhanden und c)wie oft kommt ein eintrag in aktueller Datei vor.

    Ich wollte es so lösen das ich einen vergleich der einzelnen Stringelemente mache, da ich sie bereits mit sort sortiert hab, kann ich praktisch sagen falls "==" dann beide Einträge identisch, falls "!=" schau ich welcher größer oder kleiner ist, je nachdem ist der entsprechende Eintrag also dazugekommen oder ist weggefallen und nach dem Kriterium müsst ich dann einfach diesen Eintrag mit dem Vermerk "dazugekommen" oder "entfernt" in eine neue Textdatei schreiben, den "Zeiger" auf den Eintrag dann aber nur bei einer Datei weiter wandern lassen damit ich nicht lauter unterschiede hab wenn nur eins der oberen Elemte fehlt, weil sich ja dadurch alle anderen um eine Zeile verschieben.

    Ich hab mir gedacht mit <vector> ließe sich das Problem gut lösen aber dazu hab ich auf dem Bereich zu wenig erfahrung, auf welchen weg ich die Lösung hinbekomm ist mir dann aber im Prinzip egal...

    Vielen Dank für eure Tips...



  • Moin,

    ja, man kann es mit Vektoren machen.
    Wenn es Keywerte gibt, könnte man auch eine Map nehmen.
    Das Suchen in einer Map ist schneller als das ablaufen eines Vektors.
    Näheres dazu in der Beschreibung der STL. Je nach Aufgabenstellung
    den richtigen Container aussuchen.

    Datei einlesen z.b. mit std::fstream

    pseudo code:

    std::fstream f;
    f.open(...);
    // testen f.good(), oder !f.bad()
    while ( !f.eof() )
    {
    f.getline( buffer, ... )
    vecListe1.push_back( buffer );
    }

    Das gleiche mit Liste 2

    Vektoren ablaufen

    std::vector< std::string >::const_iterator iter ( vecList1.begin() );
    std::vector< std::string >::const_iterator iterEnd ( vecList1.end() );

    while( iter != iterEnd )
    {
    const std::string& str = *iter;

    // am besten in einer Funktion den zweiten Vektor ablaufen
    // Werte vergleichen
    ++iter;
    }

    Können die Werte mehrfach vorkommen, einen Zähler mitlaufen lassen,
    wenn nicht kann man abbrechen, wenn ein Wert gefunden worden ist.

    Je nachdem was man will, kann man in einem dritten Vektor die Werte
    mit denen man in Zukunft weiterarbeiten will.

    Viel Spaß noch



  • Da du deine beiden Listen schon sortiert hast, könntest du per set_difference() die Differenz-Mengen bestimmen:

    vector<data> menge1,menge2;//Ausgangsdaten
    vector<data> neu,weg,gleich;
    
    ... // Ausgangsdaten einlesen und sortieren
    
    set_difference(menge1.begin(),menge1.end(),menge2.begin(),menge2.end(),back_inserter(weg));//gelöschte Elemente
    set_difference(menge2.begin(),menge2.end(),menge1.begin(),menge1,end(),back_inserter(neu));//dazugekommene Elemente
    set_union(menge1.begin(),menge1.end(),menge2.begin(),menge2.end(),back_inserter(gleich));//übernommene Elemente
    


  • Klasse!

    Vielen Dank für eure Hilfe, werd ich gleich mal so probieren! Dachte nicht das dass so leicht geht... Da muss wohl ein STL Buch her wenn das immer so prima klappt! 😃



  • Nix zu danken,

    wenn man sich mit der STL auskennt, dann sind solche Lösungen wie
    Sie CStoll vorgeschlagen hat eleganter. Aber ich habe mir schon
    gedacht, dass du dich noch nicht so gut mit der STL auskennst.

    Wenn Du die Möglichkeiten der STL auschöpfen willst, dann buch mal
    einen Kurs bei Frau Langer.
    http://www.angelikalanger.com
    Da habe ich (von der Firma bezahlt) vor Jahren einen C++ STL Kurs
    für Fortgeschrittene besucht.
    Auch ich habe damals erkennen müssen, wie viel Arbeit man sich mit
    der STL ersparen kann.

    Schade, dass bei vielen Firmen solches Wissen sich nicht durchsetzt.

    Viel Spaß noch.


Log in to reply