it-swarm.com.de

c ++ Aus CSV-Datei lesen

Ich habe diesen Code, der in der Konsole die Informationen aus der CSV-Datei cout soll;

while(file.good())
{

    getline(file, ID, ',');
    cout << "ID: " << ID << " " ; 

    getline(file, nome, ',') ;
    cout << "User: " << nome << " " ;

    getline(file, idade, ',') ;
    cout << "Idade: " << idade << " "  ; 

    getline(file, genero, ' ') ; 
    cout << "Sexo: " <<  genero<< " "  ;

}

Und eine CSV-Datei, die diese hat (wenn ich mit Editor öffne):

0,Filipe,19,M

1,Maria,20,F

2,Walter,60,M

Immer wenn ich das Programm starte, zeigt die Konsole Folgendes an:

Unexpected output

Meine Frage ist, warum das Programm diese Cout-Meldungen nicht in jeder Zeile wiederholt, sondern nur in der ersten

Übrigens, Name ist Name, Idade ist Alter und Geschlecht ist Geschlecht, vergessen zu übersetzen, bevor Sie diesen Beitrag erstellen

13
Mr. Phil

Sie können diese Antwort folgen, um viele verschiedene Möglichkeiten zur Verarbeitung von CSV in C++ zu sehen.

In Ihrem Fall setzt der letzte Aufruf von getline das letzte Feld der ersten Zeile und dann alle verbleibenden Zeilen in die Variable genero. Dies liegt daran, dass bis zum Ende der Datei kein Leerzeichenbegrenzer gefunden wurde. Versuchen Sie stattdessen, das Leerzeichen in eine neue Zeile zu ändern:

    getline(file, genero, file.widen('\n'));

oder prägnanter:

    getline(file, genero);

Außerdem ist Ihre Prüfung auf file.good() verfrüht. Die letzte neue Zeile in der Datei befindet sich noch im Eingabestream, bis sie beim nächsten Aufruf von getline() für ID verworfen wird. An diesem Punkt wird das Dateiende erkannt, daher sollte die Prüfung darauf basieren. Sie können dies beheben, indem Sie Ihren while -Test so ändern, dass er auf dem getline() -Aufruf für ID selbst basiert (vorausgesetzt, jede Zeile ist korrekt aufgebaut).

while (getline(file, ID, ',')) {
    cout << "ID: " << ID << " " ; 

    getline(file, nome, ',') ;
    cout << "User: " << nome << " " ;

    getline(file, idade, ',') ;
    cout << "Idade: " << idade << " "  ; 

    getline(file, genero);
    cout << "Sexo: " <<  genero<< " "  ;
}

Zur besseren Fehlerprüfung sollten Sie das Ergebnis jedes Aufrufs von getline() überprüfen.

16
jxh

eine csv-datei ist wie jede andere datei ein zeichenstrom. Die getline liest von der Datei bis zu einem Trennzeichen, in Ihrem Fall ist das Trennzeichen für das letzte Element jedoch nicht "", wie Sie annehmen

getline(file, genero, ' ') ; 

es ist Newline\n

ändern Sie diese Zeile in

getline(file, genero); // \n is default delimiter
7
Anders

Ihre CSV ist fehlerhaft. Der Ausgang ist nicht drei Schleifen, sondern nur ein Ausgang. Um sicherzustellen, dass dies eine einzelne Schleife ist, fügen Sie einen Zähler hinzu und erhöhen Sie ihn bei jeder Schleife. Es sollte nur bis eins zählen.

Dies ist, was Ihr Code sieht

0,Filipe,19,M\n1,Maria,20,F\n2,Walter,60,M

Versuche dies

0,Filipe,19,M
1,Maria,20,F
2,Walter,60,M


while(file.good())
{

    getline(file, ID, ',');
    cout << "ID: " << ID << " " ; 

    getline(file, nome, ',') ;
    cout << "User: " << nome << " " ;

    getline(file, idade, ',') ;
    cout << "Idade: " << idade << " "  ; 

    getline(file, genero) ; \\ diff
    cout << "Sexo: " <<  genero;\\diff


}
2
Ian Jenkins