• ベストアンサー

C言語 strtok

現在CSVファイルを読み込み多次元配列に格納しているのですが1行をstrtokで区切ってしまうと空白を無視してしまい、困っています。 例"xxx","","yyy","" のような文字列、空白、文字列があるとして空白は空白で読み込みたいです。 説明が下手ですいませんがなにかいい方法がありましたらご教授頂きたいです。 よろしくお願い致します。。

質問者が選んだベストアンサー

  • ベストアンサー
  • trapezium
  • ベストアンサー率62% (276/442)
回答No.3

#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

losloson
質問者

お礼

ありがとうございます。 サンプルを見つけたのでそちらを使用しましたらうまく空白を格納できているみたいです。しかし頂いたサンプルのほうが綺麗なのでそちらを使用してみたいと思います。 こちらが使用したサンプルです。 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); } }

その他の回答 (3)

回答No.4

各項目がダブルクォートで囲われたCSVファイルの場合、データ中のカンマを考慮する必要があると思いますが、それは大丈夫ですか? "A,B","C","D" というデータがあっても、「A,B」、「C」、「D」と切り出せるように作成するなら、strtokなどは使用せずに作成したほうがいいと思います。 他にも、データ中にダブルクォートを含む場合や、データ中に改行を含む場合などを考慮すると、CSVファイルの処理は結構複雑になります。Excelが出力するCSVファイルを扱う場合などは、前述の考慮が必要になることがあります。

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.2

" をセパレータに入れなければ、"" を切り出しそうですが、先頭と末尾の " は手動で除く。 ,, とか連続するケースを考慮すると strsep() の方が良さそうではあります。

losloson
質問者

補足

ありがとうございます。 strsep()は初めて聞きました 確認してみます。

  • maiko0333
  • ベストアンサー率19% (839/4401)
回答No.1

ライブラリー関数って便利ではありますが、 使用する場面が決まっていてちょっと違う使い方というものができませんよね。 1行を読み込んでstrtokで切っているのですよね。 1文字ずつ見ていってあなたのしたい動作になるように作ってみませんか?

losloson
質問者

お礼

そうなんです、作成の後半で気が付いてしまって汗 fgetcを使うのでしょうか? 一度確認してみます。

関連するQ&A

専門家に質問してみよう