- ベストアンサー
CSVファイルの読み込みで数値が正しく表示されない問題
- ファイルの読み込みでCSVファイルの数値が正しく表示されない問題について質問します。
- また、2列以上にデータが存在するCSVファイルの処理方法も教えてほしいです。
- どなたか解決策をご存知の方がいましたら、教えていただけないでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>しかしながら、CSVデータが2列以上になった場合の,でのデータの区切り方がわかっていません。 CSVの内容が 0,0.001,0.002 0.003,0.004,0.005 とかになった場合のコト…ですか? そうなると、 >fscanf(fp, "%lf\n", &b) では書式が違うので対応できません。 # fscanf()がエラー返しますかねぇ… 1行丸ごと読み込んで、','で区切ってsscanf()やatof()等で数値化します。 # atof()だと…渡した文字列がエラーだった場合…が判別できませんかねぇ。 で……CSVの切り出し処理は実はいろいろと大変です。 0,,0.002 や 0,"0.001",0.002 や、 0,0.001,"0.002 " 0.003,0.004,0.005 なんて言う変形があったりするので… # 「CSV strtok」とかで検索すると、上記の例は正しく(というか期待した)動作をしないかことが判るかと。
その他の回答 (4)
- Tacosan
- ベストアンサー率23% (3656/15482)
1行に複数ある場合, たとえば 0,1,2 という行に対して fscanf(fp, "%lf\n", &b) を繰り返し呼び出したとき, 最初の fscnaf は「エラーを返さない」はずです (とりあえず最初の「0」は読み込めるので 1 を返す). そして, 2度目の fscanf で 0 を返すと思います>#4. やりたくないけど fscanf(fp, "%lf", &b) で読み込んでから次の文字を見て考える, のかなぁ. あと, atof よりは strtod の方が安全だと思う.
お礼
丁寧な回答ありがとうございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
「うまくいかない」としか言わないで「的確な回答が得られる」と思ってはいけない. ・どのようなデータを与えたのか ・どのような結果を期待したのか ・実際にはどのようになったのか くらいは出すこと. それも画像ではとてもじゃないがみにくいのでちゃんと文字で書くべし.
補足
すみません、失礼いたしました。 (1)以下のCSVファイルをデータとして与えました 0 0.001 0.002 0.003 0.004 0.005 0.006 0.007 0.008 0.009 0.01 0.011 0.012 0.013 0.014 0.015 0.016 (2)上記の数値が数値データとして以下のような形式で出力されることを期待しました。 0 0.001 0.002 0.003 0.004 0.005 0.006 0.007 0.008 0.009 0.01 0.011 0.012 0.013 0.014 0.015 0.016 (3)下記のプログラムを書いたところ、文字列としては出力に成功しました。 #include <stdio.h> #include <conio.h> int main () { FILE *fp; char a[5], b; if((fp = fopen("1.csv", "r")) == NULL) return 0; while(fscanf(fp, "%s\n", &a) != EOF){ printf("%s\n", a); getch(); } fclose(fp); getch(); return 0; } (4)ただ、数値データとして出力したいため、下記のように改良しました。 #include <stdio.h> #include <conio.h> int main () { FILE *fp; char a[5]; double b; if((fp = fopen("1.csv", "r")) == NULL) return 0; while(fscanf(fp, "%lf\n", &b) != EOF){ printf("%.3lf\n", b); getch(); } fclose(fp); getch(); return 0; } (5)その結果、数値データとしての出力にも成功しました。しかしながら、CSVデータが2列以上になった場合の,でのデータの区切り方がわかっていません。 教えていただけないでしょうか?
- osamuy
- ベストアンサー率42% (1231/2878)
fscanfでdoubleなら%lfのような。 http://www.google.co.jp/search?hl=ja&lr=lang_ja&tbs=lr:lang_1ja&sa=X&ei=No2YTdDlIc_XcYfwgZcH&ved=0CCcQvwUoAQ&q=scanf+%E6%9B%B8%E5%BC%8F%E6%8C%87%E5%AE%9A+double&spell=1
補足
%fを%lfに書き換えてもうまくいきませんでした。 もう少し考えてみます。 ヒントか参考サイトがあれば教えていただけないでしょうか?よろしくお願いします。
- Tacosan
- ベストアンサー率23% (3656/15482)
少なくとも, 「scanf の書式文字列」について隅から隅までじっくりと調べることをお勧めします.
お礼
アドバイスありがとうございます。 じっくり読んでみます。
お礼
おかげさまで無事完成しました。 2列のCSVファイルなら読み込めます。 ありがとうございました。 完成したファイルを下に載せておきます。 #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> int main () { FILE *fp; char a[50]; double b; char *p; if((fp = fopen("test1.csv", "r")) == NULL) return 0; while(fscanf(fp, "%s\n", &a) != EOF){ p = strtok( a, "," ); b = atof(a); printf("%lf ", b); while(p != NULL) { p=strtok(NULL, ","); if(p != NULL) { b = atof(p); printf("%lf\n", b); } getch(); } } fclose(fp); return 0; }