• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:1000000レコードもあるcsvファイルの実績データをC言語で計算しているのですが...)

C言語で1000000レコードのCSVファイルのデータを計算する方法

このQ&Aのポイント
  • C言語を使って、1000000レコードのCSVファイルの実績データを計算する方法について教えてください。
  • 15番目のフィールドのデータを足し合わせて、出力する方法も教えていただきたいです。
  • 初心者なので、具体的なコードの書き方やポイントについても教えていただけると助かります。

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

  • ベストアンサー
  • f272
  • ベストアンサー率46% (8467/18126)
回答No.1

何をどう言っていいのか分からないほど,無茶苦茶な状態ですね。とりあえず,1つのレコードの15番目のフィールドをちゃんと取り出すことができるようになってください。 fgets(buffer,50,fp);  ...fpから1行読み込んでbufferに入れる p= strchr(buffer, ','); ...これでpは1番目の,のところに来た for (i=0; i<13; i++) p= strchr(p+1, ','); ...あと13回繰り返すとpは14番目の,のところに来る num= atoi(p+1); ...これで15番目のフィールドの数値を取り出す printf("%d\n",num); ...確認する

noname#96510
質問者

お礼

有難う御座います。自分はずっと、strtokを使ってどうにかしようとしていてどんどん深みにはまっていった感じになってしまいました。早速、試してみます。

noname#96510
質問者

補足

とりあえず、意見を参考にして1レコード目の15番目のフィールドの金額を出力するプログラムを書いたんですが、 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE *fp; char buffer[256],*p; int i, num; fp = fopen("j0.csv","r"); if(fp == NULL){ printf("ファイルが開けませんでした。\n"); exit(-1); } fgets(buffer,50,fp); p = strchr(buffer, ','); for(i=0;i<13;i++) p = strchr(p+1, ','); num=atoi(p+1); printf("%d\n",num); } と書いたら、セグメント違反ですと警告が、出てしまいました。 何がいけなかったか、、ご教授願いますでしょうか?

その他の回答 (3)

  • f272
  • ベストアンサー率46% (8467/18126)
回答No.4

> for(i=0;i<13;i++) > をどう変化させたらいいのでしょうか? そんなところをいじってどうする?一行分が完成したら,あとあそれを必要な回数だけ繰り返すことでしょ。「レコード数が1000000近くある」というのなら1000000近く回ループさせるわけです。 で,回数が事前にわかっているのならfor(i=0; i<n;i++)みたいに書けばよいのだけど,今の場合は回数は分からない。分かっているのはファイルを読み続けて最後に到達するまで繰り返すということ。だから while(fgets(buffer,256,fp) != NULL){ //ここに一行分の操作を入れる。ただしbufferに読み込むのは上の行でやってるから不要。 } さてこれでやってないことは,「15番目のフィールドを足し合わせて」というところです。これはどこでやるべきか?当然上に書いたループの中ですね。そしてループから脱出したところで,結果を出力すればよい。だから sum=0; ...初期化してからはじめる while(fgets(buffer,256,fp) != NULL){ ...ファイルの終わりにきたらNULLになる //ここに一行分の操作を入れる。ただしbufferに読み込むのは上の行でやってるから不要。 sum+=num; ...これで加算 } printf("合計=%d\n",sum); ...結果を出力 これでOKかな?

noname#96510
質問者

お礼

すごい!! ちゃんとプログラムが動きました。 有難う御座います。これで、次に進めます。 やはり、自分の勉強不足を痛感しました。

  • f272
  • ベストアンサー率46% (8467/18126)
回答No.3

> セグメント違反ですと警告が、出てしまいました。 確認してないけど,fgets(buffer,50,fp);では49文字あるいは\nまでをbufferに読み込みます。あなたの使っているデータがもっと長くて,そこまでで15番目のフィールドに到達していないんでしょうね。 char buffer[256],*p; というようにbufferを256文字だけ確保するということは,1行は最大でそこまであるかもしれないと思っているのでしょう。だとしたらfgetsでも最大256文字まで読み込みましょう。 fgets(buffer,256,fp);

noname#96510
質問者

補足

有難う御座います。何とか、1行目は出力できました。 この後、最後まで足していくには、 sum=sum+num を足そう思うんですが、最後まで行くには for(i=0;i<13;i++) をどう変化させたらいいのでしょうか?

回答No.2

こういう処理は、awkなどのスクリプト言語にやらせるべきです。

noname#96510
質問者

補足

これは、まだ途中で、この後awkでも同じ処理をしてCとawkの速度の差を見るようなことをやる予定なんです。 awkのほうが効率的なんですか?

関連するQ&A