web-dev-qa-db-fra.com

c ++ Lecture à partir du fichier .csv

J'ai ce code qui est censé couturer dans la console les informations du fichier .csv;

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<< " "  ;

}

Et un fichier csv qui a ceci (lorsque j'ouvre avec le bloc-notes):

0,Filipe,19,M

1,Maria,20,F

2,Walter,60,M

Chaque fois que j'exécute le programme, la console affiche ceci:

Unexpected output

Ma question est pourquoi le programme ne répète-t-il pas ces messages cout dans chaque ligne au lieu de seulement dans la première

Btw, nome est le nom, idade est l'âge et genero/sexo est le sexe, j'ai oublié de traduire avant de créer ce message

13
Mr. Phil

Vous pouvez suivre cette réponse pour voir de nombreuses façons différentes de traiter CSV en C++.

Dans votre cas, le dernier appel à getline place en fait le dernier champ de la première ligne puis toutes les lignes restantes dans la variable genero. En effet, aucun délimiteur d'espace n'a été trouvé jusqu'à la fin du fichier. Essayez plutôt de changer le caractère espace en une nouvelle ligne:

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

ou plus succinctement:

    getline(file, genero);

De plus, votre vérification de file.good() est prématurée. La dernière nouvelle ligne du fichier est toujours dans le flux d'entrée jusqu'à ce qu'elle soit supprimée par le prochain appel de getline() pour ID. C'est à ce stade que la fin du fichier est détectée, la vérification doit donc être basée sur cela. Vous pouvez résoudre ce problème en modifiant votre test while pour qu'il soit basé sur l'appel de getline() pour ID lui-même (en supposant que chaque ligne est bien formée).

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<< " "  ;
}

Pour une meilleure vérification des erreurs, vous devez vérifier le résultat de chaque appel à getline().

16
jxh

un fichier csv est comme tout autre fichier un flux de caractères. la ligne de lecture lit du fichier jusqu'à un délimiteur, mais dans votre cas, le délimiteur pour le dernier élément n'est pas '' comme vous le supposez

getline(file, genero, ' ') ; 

c'est la nouvelle ligne\n

alors changez cette ligne en

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

Votre csv est mal formé. La sortie n'est pas trois boucles mais juste une sortie. Pour vous assurer qu'il s'agit d'une seule boucle, ajoutez un compteur et incrémentez-le à chaque boucle. Cela ne devrait compter que pour un.

Voici ce que voit votre code

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

Essaye ça

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