- ベストアンサー
CSVファイルの入出力と計算方法 - C言語の質問
- C言語を用いてCSVファイルの入出力と計算を行いたいのですが、どうすればいいでしょうか?
- CSVファイルの中身は6行目までは不要な文字列で、7行目以降には使いたい数値があります。数値は5桁で、データ数は約300000行から10000000行です。
- この数値に値をかけて変換し、別のファイルとして出力したいです。変数やファイルの読み書きなど、具体的な方法が分かりません。どうすればよいでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
???????の部分ですが、例えば、 char str[MAX_STR]; while (fgets(str, MAX_STR, in) != NULL) { printf("%s", str); } のようにすれば、in で開いているCSVファイルから一行ずつ読み込んだ文字列が、strに格納されて表示されます。 この while はCSVファイルの終端までいくと終了します。 fgets関数は、呼び出すたびにファイルから一行ずつ読み込んでくれるので、 CSVファイルの先頭の6行は不要ということなら、例えば for (i = 0 ; i < 6 ; i++) { fgets(str, MAX_STR, in); } とすると、先頭の6行はスキップできます。 また、読み込んだCSVの文字列から対象の値を読み込むには、strtok関数などを使って カンマで文字列を分解するようにするといいのではないかと思います。 strtok関数で文字列を分解したら、必要な値の部分の文字列をatoi関数(もし小数ならatof関数)で数値に変換し、 必要な計算を行った後に、fprintf関数で out で開いている方のファイルに出力する…。という流れになるんじゃないかと思います。 いかがでしょう? http://www9.plala.or.jp/sgwr-t/lib/strtok.html http://www.bohyoh.com/CandCPP/C/Library/atoi.html http://www.bohyoh.com/CandCPP/C/Library/fprintf.html
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
fgets で「ファイルから一行ずつ読み込んでくれる」と言い切っちゃうのはいかがなものだろうか>#1. 1行の長さがわかっているならともかく. あと, 「実際のデータが入っている」 6行目以降はどういう形式になっているんでしょうか? 1行に 1個しかデータがないなら, 特に困ることもないような気がしますが.
お礼
書き込むべきはこちらでしたね。 ありがとうございました。
補足
ありがとうございます。 データは基本的には1行に1つですが、2つの場合もできるとありがたいです。
お礼
できました。ありがとうございます。 最終的には while(fgets(str,256,inp)!=NULL){ line++; if(line>start){ k++; times=time*k; n=strtok(str,", "); n1=atoi(n); n2=((double)n1)*20/65536-10; printf("%lf %lf \n",times,n2); fprintf(outp,"%lf %lf \n",times,n2); } } のような形にしました。 あと、恥ずかしい話ですが、 なんどやっても上手くいかない原因の一つにfopenの書き込む側のモードまでrにしていたというのがありました;;