CSVファイルの入出力と計算方法 - C言語の質問

このQ&Aのポイント
  • C言語を用いてCSVファイルの入出力と計算を行いたいのですが、どうすればいいでしょうか?
  • CSVファイルの中身は6行目までは不要な文字列で、7行目以降には使いたい数値があります。数値は5桁で、データ数は約300000行から10000000行です。
  • この数値に値をかけて変換し、別のファイルとして出力したいです。変数やファイルの読み書きなど、具体的な方法が分かりません。どうすればよいでしょうか?
回答を見る
  • ベストアンサー

CSVファイルの入出力と計算

C言語の質問です。 勉強不足で聞くのは申し訳ないのですが、 自分であれこれとやってみて、どうしていいのか分からなくなってしまいました。 csvファイルの中身は、6行目までは不要な文字列などが入っていて、7行目から使いたい数値となっています。その数値は5桁と分かっています。 さらに、データ数としては、約300000行~10000000行とデカイ上に定まっていません。 その数値に値をかけて変換してファイルとしてだしたいのですが、どうすればよいのでしょうか? 下のようなイメージ↓(値はテキトー) *********************************** 元ファイル→掛ける値→後ファイル 54321→→ *10/12365→ 1.4243 : : : : ************************************ 以下は自分で書いたものですが、 ????????????にしてあるあたり(ファイルを読み込む部分) がどうすればいいかわかりません。 変数が色々あるのは迷走の証です。 どうぞ、よろしくお願いします。 int main(){ FILE *in,*out; char fname1[30],fname2[30]; char s[5]; double n1; int n,i=0; int start=7; int line=0; printf("読み込むファイル名を入力してください\n"); scanf("%s",&fname1); in=fopen(fname1,"r"); out=fopen(fname2,"r"); if(in==NULL){ printf( "ファイルが開けません\n",fname1); return -1; } else{ ???????????????????? ?????????????????? printf("%d \n",n1); fprintf(out,"%s \n",n1); } } printf("書き込むファイル名を入力してください\n"); scanf("%s",&fname2); fclose(in); fclose(out); return 0; }

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

  • ベストアンサー
  • semisemi
  • ベストアンサー率72% (8/11)
回答No.1

???????の部分ですが、例えば、 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

agara830
質問者

お礼

できました。ありがとうございます。 最終的には 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にしていたというのがありました;;

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

fgets で「ファイルから一行ずつ読み込んでくれる」と言い切っちゃうのはいかがなものだろうか>#1. 1行の長さがわかっているならともかく. あと, 「実際のデータが入っている」 6行目以降はどういう形式になっているんでしょうか? 1行に 1個しかデータがないなら, 特に困ることもないような気がしますが.

agara830
質問者

お礼

書き込むべきはこちらでしたね。 ありがとうございました。

agara830
質問者

補足

ありがとうございます。 データは基本的には1行に1つですが、2つの場合もできるとありがたいです。

関連するQ&A

  • ファイル入出力で

    現在ファイル入出力の項目をしているのですが、以下の内容で実行すると エラーが出てどうしても実行できません。主にどこを直せばいいのでしょうか? /* ファイルをコピーするプログラム */ #include <stdio.h> int main(void) { FILE *fin, *fout; char infile[40], outfile[40]; char str[256]; printf("コピー元ファイル = "); scanf("%39s", infile); printf("コピー先ファイル = "); scanf("%39s", outfile); if( (fin = fopen(infile, "r") ) == NULL) { printf("Input file open error.\n"); return 1; } if( (fout = fopen(outfile, "w") ) == NULL) { printf("Output file open error.\n"); fclose(fin); return 1; } while(fgets(str, sizeof(str), fin) != NULL) { fputs(str, fout); } fclose(fin); fclose(fout); return 0; } エラーは FILE 、fin, fout,NULLの未定義です。 よろしくお願いします。

  • ファイルの入出力で困っています(C言語)

    はじめまして、nathan3と申します。 昔、さらっとC言語を学んでいたので、仕事場でも活用できればと思い、勉強しなおしています。 以下のプログラムですが、コンパイルはするものの、実行がなされません。 sprintfをつかってファイルを作り、fprintfで読み込み、countで繰り返し別名のファイルを読み込み・作成し…といったプログラムを書いているつもりです。 調べながら書いた稚拙なプログラムですが、ここがちがう!というところをお教えいただけると大変助かります。 #include <stdio.h> int main(void){ FILE *fp,*fo; char *fname1; char *fname2; char s[100],t[100]; int ret,count; for(count = 0 ; count < 3 ; count++) { sprintf(fname1, "sankasha%d.txt", count); fp = fopen(fname1, "r"); if (fp == NULL){ printf("%s can't open a file\n", fname1); return -1; } sprintf(fname2, "matome%d.txt", count); fo = fopen(fname2,"w"); if (fo == NULL){ printf("%s can't open a file\n", fname2); return -1; } printf("--fscanf---"); while( (ret = fscanf(fp,"%[^,],%s", s, t)) != EOF ){ fprintf(fo,"%s ", t); } } fclose(fo); fclose(fp); return 0; } 何度見直しても間違いが見つからず困窮しております。 どうぞ、みなさまのお力をお貸しください! よろしくお願いいたします。

  • 行列の積を計算するプログラムがうまくいきません

    どこが間違っているのかわかる方お願いします ・行列A,Bはファイルから読み込む ・行列A,Bの積Cの計算には関数を用いる #include<stdio.h> #define ROW 10 #define COL 10 void MatrixProduct(int a[][COL],int b[][ROW],int c[][ROW],int n,int m ) { int i,j,k; for(i=0;i<n;i++){ for(j=0;j<n;j++){ c[i][j]=0; } } for(i=0;i<n;i++){ for(j=0;j<n;j++){ for(k=0;k<m;k++){ c[i][j]=c[i][j]+a[i][k]*b[k][j]; } } } } int main(void) { FILE *fp1,*fp2; char fname1[64],fname2[64]; int a[ROW][COL],b[ROW][COL],c[ROW][COL],n,m; int i,j,k; printf("Input file name ?"); scanf("%s",fname1); printf("Output file name ?"); scanf("%s",fname2); fp1=fopen(fname1,"r"); fp2=fopen(fname2,"w"); fscanf(fp1,"%d %d",&n,&m); MatrixProduct(a,b,c,n,m); for(i=0;i<n;i++){ for(j=0;j<n;j++){ fprintf(fp2,"%3d",c[i][j]); } fprintf(fp2,"\n"); } fclose(fp1); fclose(fp2); return(0); } fp1 3 4 1 2 3 4 2 3 4 5 3 4 5 6 1 2 3 2 3 4 3 4 5 4 5 6

  • Cでのファイルからの入力およびファイルへの出力

    こんばんわ。質問があります。Cでのファイルの入出力についてなんですが、「fscanf」と「fprintf」を用いてあるデータファイルからデータを取り込んで処理をしてファイルに書き出すプログラムを作成したのですが、私が作成したプログラムの場合、まずfscanfでファイルをすべて読み込んでしまって、それから処理をして書き出すというプログラムなのですが、この方法ではなく、はじめに最初の1行だけを読みこんでその1行だけを処理して書き出し、次に2行目だけを読み込んで処理して書き出し、そして3行目を読み込んで処理・・・・という風に1行ごとに読み込みおよび書き込みを行っていくプログラムを作成したいのですがどのようにプログラムを組んでよいのか分かりません。アドバイスがいただけると幸いです。よろしくお願いいたします。 ちなみに私が作成したプログラムは下記のようなものです。 #include <stdio.h> #define NDATA 10000 #define NMAX 40 main() { double x[NDATA], y[NDATA], z[NDATA]; double xx[NDATA], yy[NDATA], zz[NDATA]; int i, n=0 FILE *in_file, *out_file; char in_filename[NMAX], out_filename[NMAX]; printf("Input filename: "); scanf("%s", in_filename); in_file = fopen(in_filename, "r"); while(fscanf(in_file, "%lf %lf %lf", &(x[n]), &(y[n]), &(z[n])) != EOF) n++; fclose(in_file); for(i=0; i<n; i++) xx[i] = x[i]*y[i]; yy[i] = y[i]*z[i]; zz[i] = z[i]*x[i]; printf("Output filename: "); scanf("%s", out_filename); out_file = fopen(out_filename, "w"); for(i=0; i<n; i++) fprintf(out_file, "%f %f %f\n", xx[i], yy[i], zz[i]); fclose(out_file); }

  • c言 ファイルのオープンについて

    #include <stdio.h> int main(void) { int ch; FILE *fp; char fname[64]; printf("ファイル名:"); scanf("%s",fname); if((fp=fopen(fname,"r"))==NULL) printf("ファイルをオープンできません。\n"); else{ while((ch=fgetc(fp))!=EOF) putchar(ch); fclose(fp); } return(0); } ファイル名は20130603.cで、実行ファイル(exe)と同じディレクトリに入れてあるのに、このプログラムでファイルをオープンできないのです。 このプログラムを実行するために必要なファイルの作成法と、例としてのファイルの内容、実行結果など、教えていただきたいのです。 色々調べてみたのですが、解決法がイマイチ見つかりませんでした。 どうかよろしくお願いします。

  • getsをscanfで書き直すにはどうしたらよいですか?

    現在。行数を数えるプログラムを例をみながらエディダに入力してコンパイルしてみたのですが、gets関数ではエラーが出てそれ以上すすまないです。 他の掲示板なんかをみると、getは危険だからscanfを使うといいですよと書いてあったのですが、書き換えかたがよく分からないのです。 *以下が問題にしているソースです。 /* ************************************* */ /* */ /* 行を数えるプログラム */ /* */ /* ************************************* */ #include <stdio.h> #include <stdlib.h> void main(void) { FILE *fp; char fname[256]; int c; int count; printf("ファイル名:"); if (gets(fnama) == NULL) { /* この部分 */ printf("入力エラーが発生しました。\n"); exit (-1); } if ((fp = fopen(fname,"r")) == NULL) { printf("ファイル '%s'をオープンできませんでした。\n",fname); exit (-1); } while ((c fgetc(fp)) != EOF) { if (c == '\n') { count++; } } printf(">>> ファイル %s は %d 行です。\n",fname,count); fclose(fp); }

  • Expression: nptr != NULL

    デバックではエラーが出なかったのですが、プログラムを走らせた所タイトルのような line:68 Expression: nptr != NULL のエラーが出ました。何が悪いのか分かりません。よろしければ、ご教示お願いします。 68行目もどこか書いておきました。 #include<stdio.h> #include<math.h> #include<string.h> #include <stdlib.h> #include <string.h> #include <windows.h> #include "conio.h" FILE *input; char fname[30]; int keisan(void); int main(void){ char *ret,infname[60],csv[]=".csv"; loop: printf("読み込むファイル名を入力してください\n"); scanf("%s",&fname); ret=strstr(fname,csv); if(ret!=NULL){printf("拡張子[.csv]を入力しないでください\n");goto loop;} strcpy(infname,fname); strcat(infname,csv); input=fopen(infname,"r"); if(input==NULL){ printf( "%sファイルが開けません\n",infname); return -1; }else{ keisan(); } fclose(input); return 0; } int keisan(void){ FILE *output; char outfname[60]; char str[256]; char *n,*nouse; int k=0; double n1,n2,time=60,times; int start=2; int line=0; strcpy(outfname,fname); strcat(outfname,"1.csv");//出力ファイル形式 output=fopen(outfname,"w"); while(fgets(str,256,input)!=NULL){ line++; if(line>=start){ k++; times=(double)k/time; n=strtok(str, ",");//1行目 n=strtok(NULL,",");//2行目 n1=strtod(n,&nouse); n=strtok(NULL,",");//3行目 n=strtok(NULL,",");//4行目 n2=strtod(n,&nouse);   ←←←68行目 printf("%d,%lf,%2.2lf,%2.1lf \n",k,times,n1,n2); fprintf(output,"%d,%lf,%2.2lf,%2.1lf \n",k,times,n1,n2); } } fclose(output); return 0; }

  • ファイルから一文字ずつ読み込む

    ファイルを読み込むfgetc()関数のところでプログラムが停止します。 以下が実行したプログラムです。 #include<stdio.h> void get_name(char name[],int a){ printf("ファイル名を入力してください。\n"); scanf("%s",name); } void open(FILE *fp2,char name[]){ if((fp2=fopen(name,"r"))==NULL){ printf("ファイルオープンエラー"); } } int count(FILE *fp3){ int ch=0; int count=0; if(fp3==NULL){ printf("error"); } while((ch=fgetc(fp3))!=EOF){ if(ch=='\n'){ count++; } } printf("TEST"); fclose(fp3); return(count); } int main (void){ FILE *fp; char fname[30]; get_name(fname,30); open(fp,fname); printf("%d",count(fp)); return(0);} ファイル名を入力してください。ファイル名を入力、プログラム停止です。 '\n'を数えれるようにしてください。御指摘お願いします。

  • エラーがどうしても解消しません。

    エラーがどうしても解消しません。 コーディング無視、コメント無しです。 (まだ、そんなレベルに達してません。 プログラムを見て頂ければ分かると思いますが。) 使用環境はXP-sp2 CPAT for Boland C++ Compiler Ver2.31 Boland C++ Compiler5.5 複数のテキストファイルを一つのファイルにまとめるプログラムです。33行目以降は出力です。 読込48ファイル目でエラーが出てしまいます。 やってみた事は7行目のファイルポインタを99に変更、以前は50でした。(改善なし) 19行目のi=0を40に変更したら40から50まではエラー無く終了。(出力までOK) 17行目のファイル数入力で10個のファイルに対して11と入力した時、11個目はエラーとなりますが、出力はでます。 しかし、47個までは正常に終了しますが48個目でエラーが出て強制終了してしまい、出力されません。 解決方法はあるのでしょうか。 宜しくお願いいたします。 1:#include <stdio.h> 2:#include <stdlib.h> 3:#include <string.h> 4: 5:int main(void) 6:{ 7: FILE *fp[99],*fpo; 8: char fname0[15]; 9: char fname1[15]; 10: char fname2[10]; 11: char fname3[5]; 12: int i,j,n=0; 13: 14: 15: printf("\n Files coupling program \n\n"); 16: printf("File name : "); scanf("%s",fname2); 17: printf("How many Files : "); scanf("%d",&n); 18: 19: for (i = 0 ; i < n ; i++) 20: { 21: sprintf(fname3,".s%02d",i+1); 22: strcpy(fname0,fname2); 23: strcat(fname0,fname3); 24: 25: 26: if(NULL == (fp[i] = fopen(fname0, "r"))) 27: { 28: fprintf(stderr, "\nCannt openfile : %\n\n",fname0); 29: break; 30: } 31: printf("Read : %s \n",fname0); 32: } ------以降省略------ 68:}

  • ファイル入出力について教えて下さい。2

    ご覧いただきありがとうございます。 何度も低レベルな質問で申し訳ありません。 A.PRMというファイルに、 I have a pen. He has a pen. と2行の文章が入っています。 これを読み取り、printfで画面表示させたいのですが、 #include <stdio.h> int main(void) { FILE *fp; char a[50]; char b[50]; if( (fp=fopen("A.PRM", "r" )) != EOF ) { fgets( a, 49, fp ); fgets( b, 49, fp ); } fclose( fp ); printf( "a = %s\n", a ); printf( "b = %s\n", b ); return 0; } とすると、fgetsで余分な改行が入ってしまいます。 fgetsの代わりにfscanfを使用すると、今度はスペースの前までしか読み込んでくれず、「a = I」「b = He」と表示されてしまいます。 どうしたらよいでしょうか? 是非ご回答いただきたいです。よろしくお願いいたします。

専門家に質問してみよう