c ++ Ler a partir do arquivo .csv

Eu tenho esse código que é para cout no console as informações do arquivo .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<< " " ; } 

E um arquivo csv que tem isso (quando eu abro com o bloco de notas):

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

Sempre que executo o programa, o console exibirá isto:

Saída inesperada

Minha pergunta é por que o programa não está repetindo essas mensagens em todas as linhas, em vez de apenas no primeiro.

Btw, nome é nome, idade é idade e genero / sexo é gênero, esqueci de traduzir antes de criar este post

Você pode seguir esta resposta para ver muitas maneiras diferentes de processar o CSV em C ++.

No seu caso, a última chamada para getline está colocando o último campo da primeira linha e depois todas as linhas restantes na variável genero . Isso ocorre porque não há delimitador de espaço encontrado até o final do arquivo. Tente alterar o caractere de espaço em uma nova linha:

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

ou mais sucintamente:

  getline(file, genero); 

Além disso, sua verificação para file.good() é prematura. A última nova linha no arquivo ainda está no stream de input até ser descartada pela próxima chamada de getline() . É nesse ponto que o final do arquivo é detectado, portanto, a verificação deve ser baseada nisso. Você pode consertar isso alterando seu teste while para ser baseado na chamada getline() para o próprio ID (supondo que cada linha esteja bem 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 uma melhor verificação de erros, você deve verificar o resultado de cada chamada para getline() .

um arquivo csv é como qualquer outro arquivo, um stream de caracteres. o getline lê do arquivo até um delimitador, mas no seu caso o delimitador do último item não é ” como você assume

 getline(file, genero, ' ') ; 

é nova linha \ n

então mude essa linha para

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

Seu csv está malformado. A saída não é de três loopings, mas apenas uma saída. Para garantir que este seja um único loop, adicione um contador e incremente-o em cada loop. Deve contar apenas para um.

Isto é o que seu código vê

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

Tente isso

 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 } 

Isso porque o seu arquivo csv está em formato inválido, talvez a quebra de linha em seu arquivo de texto não é o \ n ou

e, usando c / c ++ para analisar texto não é uma boa ideia. tente o 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