- ベストアンサー
C言語 strtok
現在CSVファイルを読み込み多次元配列に格納しているのですが1行をstrtokで区切ってしまうと空白を無視してしまい、困っています。 例"xxx","","yyy","" のような文字列、空白、文字列があるとして空白は空白で読み込みたいです。 説明が下手ですいませんがなにかいい方法がありましたらご教授頂きたいです。 よろしくお願い致します。。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#2 ですが、 > strsep()は初めて聞きました 書き忘れましたが、ISO C 標準ライブラリじゃないので、主に Unix 系にしか無いと思います。同様のことは strchr(), strpbrk() などで実現できますが、一応 strsep() の例 #if defined(_WIN32) char * strsep(char **strp, const char *sep) { char *sp, *retp = *strp; if (retp) { sp = strpbrk(retp, sep); if (sp) *sp++ = '\0'; *strp = sp; } return retp; } #endif
その他の回答 (3)
- m-take0220
- ベストアンサー率61% (480/785)
各項目がダブルクォートで囲われたCSVファイルの場合、データ中のカンマを考慮する必要があると思いますが、それは大丈夫ですか? "A,B","C","D" というデータがあっても、「A,B」、「C」、「D」と切り出せるように作成するなら、strtokなどは使用せずに作成したほうがいいと思います。 他にも、データ中にダブルクォートを含む場合や、データ中に改行を含む場合などを考慮すると、CSVファイルの処理は結構複雑になります。Excelが出力するCSVファイルを扱う場合などは、前述の考慮が必要になることがあります。
- trapezium
- ベストアンサー率62% (276/442)
" をセパレータに入れなければ、"" を切り出しそうですが、先頭と末尾の " は手動で除く。 ,, とか連続するケースを考慮すると strsep() の方が良さそうではあります。
補足
ありがとうございます。 strsep()は初めて聞きました 確認してみます。
- maiko0333
- ベストアンサー率19% (839/4401)
ライブラリー関数って便利ではありますが、 使用する場面が決まっていてちょっと違う使い方というものができませんよね。 1行を読み込んでstrtokで切っているのですよね。 1文字ずつ見ていってあなたのしたい動作になるように作ってみませんか?
お礼
そうなんです、作成の後半で気が付いてしまって汗 fgetcを使うのでしょうか? 一度確認してみます。
お礼
ありがとうございます。 サンプルを見つけたのでそちらを使用しましたらうまく空白を格納できているみたいです。しかし頂いたサンプルのほうが綺麗なのでそちらを使用してみたいと思います。 こちらが使用したサンプルです。 char *strsep(char **stringp, const char *delim) { char *s; const char *spanp; int c, sc; char *tok; if ((s = *stringp) == NULL) //文字列がNULLの場合 return (NULL); for (tok = s;;) { c = *s++; spanp = delim; do { if ((sc = *spanp++) == c) { if (c == 0) s = NULL; else s[-1] = 0; *stringp = s; return (tok); } } while (sc != 0); } }