- ベストアンサー
C言語で1000000レコードのCSVファイルのデータを計算する方法
- C言語を使って、1000000レコードのCSVファイルの実績データを計算する方法について教えてください。
- 15番目のフィールドのデータを足し合わせて、出力する方法も教えていただきたいです。
- 初心者なので、具体的なコードの書き方やポイントについても教えていただけると助かります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
何をどう言っていいのか分からないほど,無茶苦茶な状態ですね。とりあえず,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); ...確認する
その他の回答 (3)
- f272
- ベストアンサー率46% (8467/18126)
> 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かな?
お礼
すごい!! ちゃんとプログラムが動きました。 有難う御座います。これで、次に進めます。 やはり、自分の勉強不足を痛感しました。
- f272
- ベストアンサー率46% (8467/18126)
> セグメント違反ですと警告が、出てしまいました。 確認してないけど,fgets(buffer,50,fp);では49文字あるいは\nまでをbufferに読み込みます。あなたの使っているデータがもっと長くて,そこまでで15番目のフィールドに到達していないんでしょうね。 char buffer[256],*p; というようにbufferを256文字だけ確保するということは,1行は最大でそこまであるかもしれないと思っているのでしょう。だとしたらfgetsでも最大256文字まで読み込みましょう。 fgets(buffer,256,fp);
補足
有難う御座います。何とか、1行目は出力できました。 この後、最後まで足していくには、 sum=sum+num を足そう思うんですが、最後まで行くには for(i=0;i<13;i++) をどう変化させたらいいのでしょうか?
- bloomerist
- ベストアンサー率4% (1/22)
こういう処理は、awkなどのスクリプト言語にやらせるべきです。
補足
これは、まだ途中で、この後awkでも同じ処理をしてCとawkの速度の差を見るようなことをやる予定なんです。 awkのほうが効率的なんですか?
お礼
有難う御座います。自分はずっと、strtokを使ってどうにかしようとしていてどんどん深みにはまっていった感じになってしまいました。早速、試してみます。
補足
とりあえず、意見を参考にして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); } と書いたら、セグメント違反ですと警告が、出てしまいました。 何がいけなかったか、、ご教授願いますでしょうか?