web-dev-qa-db-ja.com

c ++ .csvファイルから読み取る

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

}

そして、これを持っているcsvファイル(メモ帳で開いたとき):

0,Filipe,19,M

1,Maria,20,F

2,Walter,60,M

プログラムを実行するたびに、コンソールに次のように表示されます。

Unexpected output

私の質問は、プログラムが最初の行だけでなくすべての行でこれらのcoutメッセージを繰り返すのはなぜですか

ところで、nomeは名前、idadeは年齢、genero/sexoは性別です。この投稿を作成する前に翻訳するのを忘れていました

13
Mr. Phil

この回答 に従って、C++でCSVを処理するさまざまな方法を確認できます。

あなたの場合、getlineの最後の呼び出しは、実際には最初の行の最後のフィールドを入れ、残りのすべての行を変数generoに入れます。これは、ファイルの終わりまでスペース区切り文字が見つからないためです。代わりにスペース文字を改行に変更してみてください:

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

以上簡潔に:

_    getline(file, genero);
_

さらに、file.good()のチェックは時期尚早です。ファイル内の最後の改行は、IDの次のgetline()呼び出しによって破棄されるまで、入力ストリーム内にあります。この時点でファイルの終わりが検出されるため、チェックはそれに基づいている必要があります。これを修正するには、whileテストをID自体のgetline()呼び出しに基づいて変更します(各行が適切に形成されていると仮定)。

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

エラーチェックを改善するには、getline()の各呼び出しの結果をチェックする必要があります。

16
jxh

csvファイルは、他のファイルと同様に文字のストリームです。 getlineはファイルから区切り文字まで読み取りますが、あなたの場合、最後のアイテムの区切り文字は「

getline(file, genero, ' ') ; 

改行です\ n

その行を

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

CSVの形式が正しくありません。出力は3つのループではなく、1つの出力です。これが単一ループであることを確認するには、カウンターを追加し、ループごとに増分します。 1つだけにカウントする必要があります。

これはあなたのコードが見るものです

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

これを試して

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