c ++ Lectura del archivo .csv

Tengo este código que se supone que contiene en la consola la información del archivo .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<< " " ; } 

Y un archivo csv que tiene esto (cuando abro con el bloc de notas):

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

Cada vez que ejecuto el progtwig, la consola mostrará esto:

Resultado inesperado

Mi pregunta es por qué el progtwig no repite esos mensajes de cout en cada línea en lugar de solo en la primera

Por cierto, nome es name, idade es age, y genero / sexo es gender, se olvidó de traducir antes de crear esta publicación

Puede seguir esta respuesta para ver muchas formas diferentes de procesar CSV en C ++.

En su caso, la última llamada a getline es poner el último campo de la primera línea y luego todas las líneas restantes en la variable genero . Esto se debe a que no se encuentra un delimitador de espacio hasta el final del archivo. Intenta cambiar el carácter de espacio en una línea nueva en su lugar:

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

o más sucintamente:

  getline(file, genero); 

Además, su cheque para file.good() es prematuro. La última nueva línea en el archivo se encuentra todavía en la secuencia de entrada hasta que se descarta en la próxima llamada a getline() para la ID . Es en este punto que se detecta el final del archivo, por lo que la verificación debe basarse en eso. Puede solucionarlo cambiando la prueba while para que esté basada en la llamada getline() para la ID misma (suponiendo que cada línea esté bien formada).

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

Para una mejor verificación de errores, debe verificar el resultado de cada llamada a getline() .

un archivo csv es como cualquier otro archivo una secuencia de caracteres. el getline lee desde el archivo hasta un delimitador; sin embargo, en su caso, el delimitador del último elemento no es ” como usted supone

 getline(file, genero, ' ') ; 

es nueva línea \ n

así que cambia esa línea a

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

Tu csv está mal formada. La salida no es de tres bucles, sino de una sola salida. Para asegurarse de que se trata de un bucle único, agregue un contador e increméntelo con cada ciclo. Solo debería contar hasta uno.

Esto es lo que ve su código

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

Prueba esto

 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 } 

Debido a que su archivo csv está en formato no válido, tal vez el salto de línea en su archivo de texto no sea \ n o \ r

y, usar c / c ++ para analizar texto no es una buena idea. prueba awk:

  $awk -F"," '{print "ID="$1"\tName="$2"\tAge="$3"\tGender="$4}' 1.csv ID=0 Name=Filipe Age=19 Gender=M ID=1 Name=Maria Age=20 Gender=F ID=2 Name=Walter Age=60 Gender=M