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:
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