Dubletten löschen



  • Hallo Leute,

    ich habe eine Textdatei, die sieht z.B. so aus:

    11111
    22222
    33333
    22222
    55555
    77777

    Nun will ich diese Datei einlesen, und die Dubletten löschen, und dann wieder abspeichern:
    11111
    22222
    33333
    55555
    77777

    WIE KANN ICH DAS MACHEN?
    Ich hatte mir mal in perl eine passende Routine geschrieben:
    open(F1,"<infile") || die "FEHLER EINGANGSDATEI!"; my @liste = ; close(F1); %seen = (); @listeneu = (); gesamt = 0;
    $dups = 0;
    foreach $item (@liste)
    { gesamt++;unless(gesamt++; unless (seen{item}) { seen{$item} = 1;
    push (@listeneu, item); } else { dups++;
    }
    }
    open (OUTFILE, ">$outfile") || die "DATEIFEHLER ! DATEI PRÜFEN!";
    print OUTFILE @listeneu;
    close (OUTFILE);

    NUR WIE MACHE ICH DAS IN C++

    DANKE

    polo



  • set<string> gefunden;
    string zeile;
    ifstream fin("In.txt");ofstream fout("Out.txt");
    while(getline(fin,zeile))
    {
      if(gefunden.find(zeile))continue;
      fout<<zeile<<endl;
      gefunden.insert(zeile);
    }
    

    Oder eleganter (wenn dir die Reihenfolge nicht wichtig ist) - komplett einlesen, sortieren und mit unique_copy() schreiben.



  • zeilenweise einlesen, links und rechts trimmen
    in einem set std::string einfügen und danach
    eintrag für eintrag speichern.

    (Einträge in einen Set sind immer eindeutig,
    Sortierung erfolgt über Operatoren von std::string)



  • Hallo,

    was mache ich falsch, ich kann kein set erstellen.
    Es kommt der Fehler ... 'set' : undeclared identifier

    Ausserdem kommt bei "while(getline(fin,zeile)" ebenfalls ein Fehler. Ich kann es nur über fin.getline ansprechen...Irgendwas stimmt hier doch an meinen compilereinstellungen noch nicht!

    DANKE!!!



  • polocpp schrieb:

    Hallo,

    was mache ich falsch, ich kann kein set erstellen.
    Es kommt der Fehler ... 'set' : undeclared identifier

    #include <set>
    #include <string>
    #include <fstream>
    using namespace std;
    


  • #include <set> //dort steht die set drin
    #include <string> //für die getline()
    using namespace std;
    

    ^^ das gehört an den Anfang deiner CPP



  • AHA!

    Das
    #include <set>
    hat mir noc hgefehlt.

    Jetzt klappt ja fast, nur warum kommt bei
    gefunden.insert(zeile);
    ein Fehler (es werden 3 Parameter benötigt??)

    DANKE!!



  • Keine Ahnung - normalerweise müsste der Compiler dort die 1-Parameter-Version "set<T>::insert(const T& val);" verwenden.



  • Hallo,

    ich verzweifle mit meinem c++ compiler (MS Visual C++ 6.0)...

    Ich habe nun folgendes Programm:

    #include <set> 
    #include <string> 
    #include <fstream> 
    using namespace std; 
    
    int main()
    {
    
    set<string> gefunden; 
    string zeile; 
    ifstream fin("In.txt");ofstream fout("Out.txt"); 
    while(getline(fin,zeile)) 
    { 
      if(gefunden.find(zeile)) continue; 
      fout<<zeile<<endl; 
      gefunden.insert(zeile); 
    } 
    
     return 0;
    }
    

    Und dann bekomme ich folgenden Fehler:
    h:\2005\settest\settest.cpp(17) : error C2451: conditional expression of type 'class std::_Tree<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class

    und dazu noch 6 warnings "warning C4786: 'std::_Tree<std::basic_string<char,std::char_traits<char>...."

    WAS LÄUFT DENN HIER FALSCH??? 😡



  • CStoll (off) schrieb:

    if(gefunden.find(zeile))continue;
    

    vielleicht beschwert er sich über diese zeile?

    if (gefunden.find(zeile) != gefunden.end()) continue;
    


  • GENAU !! DANKE!!

    jetzt bekomme ich keinen Fehler mehr, und das Programm funktioniert wie gewünscht!

    NUR: ich bekomme noch 100 warnings (in dem kleinen Programm!!)
    Ich habe in http://support.microsoft.com/default.aspx?scid=kb;en-us;167355 gefunden das dies ein bekannter Bug von MS Visual C++ 6.0 ist! KANN DAS SEIN? WIE KANN ICH DIE MELDUNGEN DEAKTIVIEREN. Das nervt!

    DANKE!!!!



  • Hallo,

    jetzt habe ich doch noch ein anderes Problem.
    Ich sollte auch noch die Anzahl der Dubletten ermitteln! Geht das so auf diese Weise überhaupt??

    DANKE



  • Hallo,

    jetzt habe ich doch noch ein anderes Problem.
    Ich sollte auch noch die Anzahl der Dubletten ermitteln! Geht das so auf diese Weise überhaupt??

    DANKE



  • Das Problem habe ich jetzt selber hinbekommen:

    while(getline(fin,zeile)) 
    	{ 
    	         i++;
    		if (gefunden.find(zeile) != gefunden.end())	continue;
    		ineu++;
    		fout<<zeile<<endl; 
    		gefunden.insert(zeile);	
    	} 
    
    	dubeletten = i - ineu;
    


  • mit set gehts auch eleganter
    set::insert gibt dir ein std::pair<iterator,bool> zurück.

    while(getline(fin,zeile)) { 
        if ( gefunden.insert(zeile).second ) {
            ineu++;
            fout<<zeile<<endl; 
        } 
        i++;
    }
    dubeletten = i - ineu;
    

    Kurt


Anmelden zum Antworten