21

コンソールで .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

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

予期しない出力

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

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

4

4 に答える 4

25

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

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

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

またはより簡潔に:

    getline(file, genero);

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

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()

于 2013-05-08T17:51:46.473 に答える
9

csv ファイルは、他のファイルと同じように、文字のストリームです。getline はファイルから区切り文字まで読み取りますが、あなたの場合、最後の項目の区切り文字は ' ' ではありません

getline(file, genero, ' ') ; 

改行です\n

その行を次のように変更します

getline(file, genero); // \n is default delimiter
于 2013-05-08T18:14:59.070 に答える
4

csv の形式が正しくありません。出力は 3 つのループではなく、1 つの出力のみです。これが 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


}
于 2013-05-08T17:37:27.603 に答える
-5

csv ファイルが無効な形式であるため、テキスト ファイルの改行が \n または \r ではない可能性があります。

また、c/c++ を使用してテキストを解析することはお勧めできません。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
于 2013-05-08T17:47:15.677 に答える