Teile einer Datei einlesen



  • Hallo Leute,

    bin C++ Neuling und will aus einer csv Datei nur bestimmte Dinge einlesen.
    Die Datei ist durch Semikolons getrennt:

    Bsp:
    Name1 ;Nummer1;Name2; Nummer2 usw..

    Ich will jetzt die Nummer hinter jedem 6.en Semikolon z.b. in einem string speichern - wie geht das??

    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    
        ifstream lesen;
    
        lesen.open("Datei.csv");
    
        if (!lesen)
    
        {
            cerr << "Datei konnte nicht geoeffnet werden!"; 
            return -1;
        }
    
        string a;
        while (!lesen.eof())
    
        {
    
            getline(lesen,a);
    
        }
        lesen.close();
        return 0;
    }
    

    Ich bin soweit das ich die Datei als ganzes einlesen kann, dass hilft mir aber nichts. Bitte um Hilfe!



  • 1. Ich will mir die Textdatei nicht zusammenfrickeln. Du musst schon komplette Zeilen deiner Datei hier posten.
    2. Was heißt "z.b. in einem string speichern"? Wenn du uns sagst, was die Nummer bedeutet, können wir dir auch den passenden Datentypen nennen.
    3. Man öffnet eine Datei nicht mit open. Man übergibt den Namen der Datei dem Konstruktor.
    4. Man schließt keine Datei manuell, da es automatisch geschieht, wenn das Objekt zerstört wird.
    5. Du hast einen großen Fehler gemacht. Den macht aber jeder Anfänger. Du hast etwas aus der Datei gelesen und hast dem Lesevorgang so viel Vertrauen geschenkt, dass du dir erspart hast, zu prüfen, ob der Lesevorgang überhaupt erfolgreich war. Du musst: 1. Lesen --> 2. Prüfen ob erfolgreich --> 3. Falls erfolgreich, das Gelesene verarbeiten.



  • das was out schreibt ist alles richtig. Anbei noch ein Versuch eines Programms was Dein Problem löst.
    Deine Aussagen

    DDTT schrieb:

    Bsp:
    Name1 ;Nummer1;Name2; Nummer2 usw..

    und

    DDTT schrieb:

    Ich will jetzt die Nummer hinter jedem 6.en Semikolon ...

    widersprechen sich.
    Folgt auf jeden Namen eine Nummer, so stehen die Nummern stets hinter einer ungeraden Anzahl von Semikola.

    DDTT schrieb:

    Ich will jetzt die Nummer ... in einem string speichern - wie geht das??

    und warum möchte jeder Anfänger seine Zahlen in einen String speichern? .. ich habe keine Ahnung. Es gibt in C++ den Typ int und double für Zahlen.

    Wichtig für Dich zu wissen ist:
    - mit ignore kann man alles bis zu einem bestimmten Zeichen überlesen
    - mit lesen >> nummer kann man Zahlen als Zahlen lesen

    #include <fstream>
    #include <iostream>
    #include <vector>
    #include <limits> // numeric_limits
    
    int main()
    {
        using namespace std;
        const streamsize ALLES = numeric_limits< streamsize >::max();
    
        vector< int > nummern;
        ifstream lesen( "Datei.csv" );
        if (!lesen.is_open()
        {
            cerr << "Datei konnte nicht geoeffnet werden!\n";
            return -1;
        }
        for( ;; lesen.ignore( ALLES, '\n' ) )
        {
            for( int i=0; i<5; ++i ) // überlese 5 Semikola bis zum 6.Feld
                lesen.ignore( ALLES, ';' );
            int nummer;
            if( !(lesen >> nummer) )
                break;
    
            nummern.push_back( nummer );
        }
        if( !lesen.eof() )
            cerr << "Lesefehler" << endl;
        cout << nummern.size() << " Eintraege gelesen" << endl;
        return 0;
    }
    

    .. sollte die Nummer tatsächlich hinter dem 6.Semikolon stehen, so musst Du in Zeile 21 aus der 5 eine 6 machen.

    Gruß
    Werner



  • Erstmal danke für die Antworten.

    Um nochmal genauer auf die Datei einzugehen:

    Es handelt sich um eine Adressliste mit folgendem Aufbau

    Gemeindekennzahl;Gemeinde;Bezirksnummer;Bezirk;Straße;Straßennummer;Postleitzahl;usw;usw
    .
    .
    .
    .
    .
    usw.

    Es geht mir also um die Postleitzahlen, um alle Postleitzahlen.
    Diese stehen hinter jedem 6.en Semikolon und ich würde gerne alle, so wie sie sind aus der Datei raus in einen string, vektor, oder was auch immer ihr für besser haltet schreiben.

    Hoffe das bringt etwas klarheit



  • .. dann ersetze die Zeilen 21 bis 27 durch

    for( int i=0; i<6; ++i ) // überlese 6 Semikola
                lesen.ignore( ALLES, ';' );
            string plz;
            if( !getline( lesen, plz, ';' ) )
                break;
    
            nummern.push_back( plz );
    

    ersetze noch den Typ im vector von int nach string und #include <string> nicht vergessen. Dann sollte es gehen.

    Gruß
    Werner


Anmelden zum Antworten