- ベストアンサー
文字列として扱うCSVファイルの取り扱い方法
- CSVファイルの中で文字として扱いたい場合、カンマやダブルクォートに注意が必要です。
- C言語ではfgetsとstrtokを使用してCSVファイルを効率的に取り扱うことができます。
- カンマ間の項目のダブルクォート数をカウントし、その数に応じて文字列を取り扱う方法を説明しています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ざっくりstrtokで改行も弾いて関数使いまくり','に置き換えました やはり文字列飲み込んで"カウントして切り貼りしなきゃいけないかな #include <stdio.h> #include <string.h> int main(void){ char str[] = "\"100,AAA,002\",\"1,B\nB\"2B,,B3\",\"1CCC,\n,\"2\"3,4\""; char *point = str , mem[10][30] = {{}} , co_1 , co_2; for(co_1 = 0; (point = strtok(point,",\n")) != NULL; co_1++){ if(*(point+(strlen(point)-1)) != '"'){ strcat(strcat(mem[co_1],point),","); co_1--; }else{ strcat(mem[co_1],point); } point = NULL; } for(co_2 = 0; co_2 < co_1; co_2++) printf("%s\n",mem[co_2]); return 0; }
その他の回答 (3)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
その昔、状態遷移を使って同様のCSV-parserを実装しました。
- type0(@type0)
- ベストアンサー率56% (344/612)
参考URLに記載の質問のベストアンサーのロジックがご要望に適しているかと思います。 CSVの一般的な書式はRFC4180に定義されていますので、 ご参考までに。 http://www.kasai.fm/wiki/rfc4180jp 但し、ダブルクォート有りの場合、ダブルクォート内に改行も記述する事が可能なので、 これも考慮する必要があります。 この場合、各項目を抽出する前にダブルクォートが偶数となるまで 次行と連結する処理などが必要となります。
- maiko0333
- ベストアンサー率19% (839/4401)
(1)は良いとして、 (2)から(4)は""を"に置き換えていけばいいと思います。 ロジック的に言うと「"が出てきたら1つ前が"なら無視する」でいい。
お礼
ありがとうございます。 参考にさせていただきます。
お礼
ありがとうございます。 区切り文字を","としている点が少し私の行いたい事と異なっていましたがロジックはかなり参考になりました。