• ベストアンサー

csvファイルの実績データをC言語で解析するのですが...

C言語を学び始めたばかりなのに、csvファイルの実績データでフィールドが15あり、レコード数が1000000近くあるファイルの15番目のフィールドを足し合わせて、出力するということをやっているのですが、まだまだわからないことだらけです。 1レコード目がカラム名なので2レコード目から足し合わせるんですがそこのところもよくわからずじまいで... 一応、書いたプログラムが #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE *fp; char buffer[50],*p; int cnt, num, sum; fp = fopen("j0.csv","r"); if(fp == NULL){ printf("ファイルが開けませんでした。\n"); exit(-1); } while(fgets(buffer,fp) != NULL){ p = strtok(buffer,","); cnt = 1; while(p!=NULL){ num = atoi(p); printf("%d:%d,",cnt,num); p = strtok(NULL,","); cnt++; if(cnt==15) sum=sum+num } printf("\b\b \n"); } printf(%d \n",num); fclose(fp); return(0); } と書いたんですが、ぜんぜんな状態です。誰かご教授願えませんか?

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

while(fgets(buffer,fp) != NULL){ p = strtok(buffer,","); cnt = 1; while(p!=NULL){ num = atoi(p); printf("%d:%d,",cnt,num); p = strtok(NULL,","); cnt++; if(cnt==15) sum=sum+num }     ↓ sum = 0; //初期化 while( fgets(buffer, sizeof(buffer), fp) != NULL){   p = strrchr(buffer,','); //カンマを後ろから探す   if ( p == NULL ) {     //カンマが無い→オカシイデータの処理   } else {     sum += atoi(p+1); //カンマの次の文字から変換   } } もし、49バイト以上の行、カンマが14個でない行、このようなデータが あると、正しく動作しません。また、カンマの直後に空白があったり しても上手く変換できないことがあります。

fzgu1984
質問者

補足

早速書き直してみたんですが、 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE *fp; char buffer[50],*p; int cnt, num, sum; fp = fopen("j0.csv","r"); if(fp == NULL){ printf("ファイルが開けませんでした。\n"); exit(-1); } sum = 0; while( fgets(buffer, sizeof(buffer), fp) != NULL){   p = strchr(buffer,',');   if ( p == NULL ) {        } else {     sum += atoi(p+1);   } } printf("%d \n",sum); fclose(fp); return(0); } これで、実行してみたら、大量のerror: stray ~ in program というエラーが出てきて、こんなエラーはじめてみたので今、ひっちゃかめっちゃかになってしまっているんですが、どうしたらよいでしょうか?

その他の回答 (3)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

もしかしてコピペした? インデントに漢字空白を使っているので、回答をそのままコピペ するとエラーになってしまいますよ。

fzgu1984
質問者

お礼

有賀と御座います。無事に動きました。 これで何とか、次の作業に移れそうです。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

CSVは本式にやると非常に大変ですが、一行のフォーマットによっては、sscanfが便利です。 例えば、一行の内容が 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 と、すべて数値なら、 int num; sscanf(buffer,"%*d,%*d,%*d,%*d,%*d,%*d,%*d,%*d,%*d,%*d,%*d,%*d,%*d,%*d,%d",&num) ; でnumに15番目の値が入ります。 念のため、sscanfの戻りをチェックするといいでしょう。

fzgu1984
質問者

お礼

ssanfというものがあることを知りませんでした。早速、調べてみます。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

>ぜんぜんな状態です。 具体的に書いてください。 ソースをざっと見たところでは、少なくとも 1)fgetsの引数の再確認 2)sumの初期化(足し込んでいくので初期値はゼロ) が必要です。他にも問題点があるかもしれません。

関連するQ&A