C言語、CSVファイルの読み込みと加工、別ファイル出力プログラムがうまくいかない

このQ&Aのポイント
  • C言語を使用してCSVファイルを読み込み、加工して別のCSVファイルに出力するプログラムがうまくいきません。
  • プログラムでは、B列の数値のみを変更したいのですが、正しく数値が読み込まれず、すべてA列に入力されてしまいます。
  • 提供されたプログラムはファイルを開く、CSVファイルから数値を読み込む、数値を加工する、別のCSVファイルに書き込むという手順で構成されています。
回答を見る
  • ベストアンサー

C言語、CSVファイルを読み込んで、加工して別CS

C言語、CSVファイルを読み込んで、加工して別CSVファイルに出力するプログラムがうまくいきません。 行いたいことは A列 B列 ←エクセルの列です。 1   -0.0001 2   -0.000021 3   -0.1111 4   -0.255 5   -0.223 というCSVファイルの中身を加工してB列の数値のみを変えたいのですが、うまくいくません。作成したプログラムでは A列    B列 1 0000 2 0000 3 0000  4 0000 5 0000  となり、うまく数値が読み込めていません。-だからでしょうか。 また全てA列に入力されてしまいます。 以下作成したプログラムになります。 #include <stdio.h> #define N 5 int main(void) { int i; double r[N], w[N - 1]; FILE *fpr = fopen("C:\\Users\\XXX\\Desktop\\aaa.csv", "r"); for (i = 0; i < N; ++i) { fscanf(fpr, "%*d %lf", &r[i]); } fclose(fpr); for (i = 0; i < N - 1; ++i) { if (i == 0) { w[0] = r[0] + r[0]; } else { w[i] = w[i - 1] *(r[i]-w[i + 1]); } } FILE *fpw = fopen("C:\\Users\\XXX\\Desktop\\bbb.csv", "w"); for (i = 0; i < N - 1; ++i) { fprintf(fpw, "%d %.5lf\n", i + 1, w[i]); } fclose(fpw); return 0; } お手数ですが、よろしくお願いいたします。

  • kalgi
  • お礼率0% (2/210)

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

○CSVファイル、というのは、通常は、Comma Separated Values の名前の通り、「カンマ(,)で区切られたデータ」になっています。 そのfscanfの書式を見ると、 「整数(読み飛ばす) 空白 数値(読み込む) 」となっているファイルを読もうとしています。 どちらが正しいのでしょうか? 空白区切りが正しいのなら「CSV」などと誤った名前を使わないようにしましょう。 カンマ区切りが正しいのなら、fscanfの書式を正しいものにしましょう。 ○ あるいは、もっと他の方法を探しましょう。 「C言語を使わなければならない積極的な理由」が無ければ、他の方法を使った方がはるかに楽です。 例えば、そのままエクセルを使って、 C1: =B1+B1 C2: =C1*(B2-C3) ... とでもやれば済むことです。 で気付いたのですが > w[i] = w[i - 1] *(r[i]-w[i + 1]); この時点で、w[i+1]には何も入っていません。C言語の場合、このような場合に、どんな値になっているか、わかりません。 (デバッグモードでは0に初期化されていることもありますが) 計算式、または計算順番を間違えていませんか? ○ここでは ・質問が解決したら締め切る ・続きの質問を投稿する前に、前の質問は締め切る というルールになっています。過去の質問は適切に処理しましょう。

その他の回答 (1)

noname#208507
noname#208507
回答No.1

> fscanf(fpr, "%*d %lf", &r[i]); 引数が足りないのでは。 それに区切り文字(空白かタブか)は合っていますか。

関連するQ&A

  • C言語 ファイルの読み込みについて

    以下のようなプログラムを実行します \nで改行が行われません。なぜでしょうか? #include <stdio.h> void main () { FILE *fp; double a, b; int count=0; fp = fopen("arm_x.csv","r"); while(1) { fscanf(fp,"%lf%lf\n",&a,&b); printf("%f::%f\n",a,b); count++; if(count==10)break; } fclose(fp); } csvファイルは 0.0 0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5・・・ 0.2 0.3 0.4・・・・・・・・・ : : です。 実行結果はこのようになってしまいます。 0.0 0.1 0.2 0.3 0.4 0.5 : :

  • C言語のプログラムを見てください

    ある100行の値がx列、y列の2列あるファイルを読み込んでそれを配列に入れ、yの最小値及びそれと同じ行にあるxの値を表示するプログラムを書きたいのですがy列の最小値を表示するプログラムを書き終えた所でコンパイルして実行してみると正しく値が表示されませんでした。それどころか実行するたびに値が変わってしまいます。どこがおかしいのかわからないため、ご指摘のほどよろしくお願いします。また、できれば同じ行にあるx列の値も表示させるプログラムを教えてください。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #define N 100 int main(void) { int x[N],i; double y[N],min; FILE *fp; fp=fopen("book.dat","r"); if(fp==NULL){ puts("can't open file!"); exit(-1); } for(i=0;i<N;i++){ fscanf(fp,"%d %lf", &x[N],&y[N]); printf("x=%d\n y=%lf\n",x[N],y[N]); } min=y[0]; for(i=1;i<N;i++){ if(y[i]<min) min=y[i]; } fclose(fp); printf("最小値:%lf\n",min); return 0; }

  • C言語でCSVデータを読み込んで加工して保存したい

    C言語でCSVデータを読み込んで加工して保存したい。 CSVデータの中身は 1 -0.001 2 -0.11 3 -0.22 4 -0.625 5 -0.55 という式を、 一行目+0行目=答え(1) 答え(1)+2行目=答え(2) 答え(2)+3行目=答え(3)という処理を行い、 1 答え(1) 2 答え(2) 3 答え(3) 4 答え(4) 5 答え(5) とCSVファイルに加工して保存するプログラムを作りたいのですが、どのようなプログラムを追加すれば良いのか分かりません。恐らくCSV内部データを配列データに保存して、配列データをfor分にて計算していけばよいのでしょうが、分かりません。 プログラム例を記載していただけないでしょうか。 以下CSVファイルを読み込んで表示するプログラムを示します。下記プログラムに加筆をお願いいたします。 #include <stdio.h> int main(void) { FILE *fp; char *fname = "C:\\Users\\XXX\\Desktop\\aaa.csv"; char s[100]; int ret, n1, n2; float f1, f2; fp = fopen( fname, "r" ); if( fp == NULL ){ printf( "%sファイルが開けません¥n", fname ); return -1; } while( ( ret = fscanf( fp, "%[^,],%d,%d,%f,%f", s, &n1, &n2, &f1, &f2 ) ) != EOF ){ printf( "%s %d %d %f %f", s, n1, n2, f1, f2 ); } fclose( fp ); return 0; }

  • 型によらないCSVファイルの読み込みC言語プログラ

    あらかじめ型のわかっているN行*M列のエクセルデータをCSV形式にし、 読み込むプログラムを作成しました。 そのプログラムを下に示します #include <stdio.h> #include <stdlib.h> #include <string.h> /* 確保するデータ保存領域の大きさ(N行×M列) */ #define N 23 #define M 6 /* データの区切り文字 */ #define SEP_DATA ',' int csv_read(char filename[], double csv[N][M]) { /* ファイルオープン */ FILE *fp; if( (fp = fopen(filename, "r")) == NULL ) { printf(" file open error!!\n"); return -1; } /* 1行毎に読み出し */ char line[256], *ptr; int i, j, k; i=0; while (fgets(line, 256, fp) != NULL) { printf("*%s", line); ptr = line; j=0; do{ /* line[j]から次のタブ文字までを数値に変換 */ csv[i][j] = atof(ptr); /* 次のタブ文字の位置を探す */ ptr = strchr(ptr, SEP_DATA); /* タブ文字の次の文字を示す */ if (ptr!=NULL) { ptr++; } j++; }while(ptr!=NULL && j<M); i++; } /* ファイルクローズ */ fclose(fp); return 0; } int main(int argv, char *argc[]) { char filename[256]; if( argv > 1){ strcpy(filename, argc[1]); } else { printf("Please Input Filename:"); scanf("%s", filename); } /* データ保存用の領域を確保 */ double (*csvdata)[M]; csvdata = (double(*)[M])malloc(sizeof(double[M]) * N); //malloc(sizeof(*csvdata) * N); if ( csvdata == NULL ){ return -1; } int i,j; /* 配列の初期化 */ for( i=0; i<N; i++) { for( j=0; j<M; j++) { csvdata[i][j] = 0.0; } } /* CSVデータの読み込み */ if( csv_read(filename, csvdata) < 0 ) { return -1; } /* 配列の出力 */ for( i=0; i<N; i++) { printf("%lf", csvdata[i][0]); for( j=1; j<M; j++) { printf("\t%lf", csvdata[i][j]); } printf("\n"); } free(csvdata); csvdata = NULL; return 0; } これをNとMがどんな値であれ読み込めるようにするにはどうすれいいでしょうか

  • C言語でCSVファイルのオープン・クローズができな

    C言語でCSVファイルのオープン・クローズができない。 下記のプログラムですが、CSVファイルが読み込めません。 どのようにすれば読み込めるのでしょうか。よろしくお願いいたします。 #include <stdio.h> int main(void) { FILE *fp; fp = fopen("aaa.csv","r"); if (fp == NULL) printf("ファイルを開けません。"); else { fclose(fp); } return(0); }

  • C言語 csv 配列

    CSVファイルを2次元配列に格納したいのですが、書き方がわかりません。 csvファイルは1024×2048の0と1のみで構成されています。 fp=fopen(path,"r"); for(j=0; j<1024; j++) { for(i=0; i<2048; i++) { char c; do{c=(getc(fp));} while(c==','||c=='\n'||c=='\r'); map[j][i] = c-'0'; } } このように書きできたと思ったのですが、どうもうまくいっていないみたいです。 どこが悪いのか、どういう風に書けばいいのか教えていただげれば幸いです。

  • C言語のファイル読み込み

    あるcsvファイルがあり、それは以下のように(規則性のない)波形のデータです。 0.001 0.14 0.002 0.32 0.003 0.46 ・ ・ 2.000 0.22 左側がx軸、右側がy軸で、データはそれぞれ2000個あります。 このデータ(波形)をC言語のプログラムに読み込ませるにはどうしたらいいのでしょうか? #include <stdio.h> int main(void) { double i,j; FILE *file; file = fopen("sample.csv","r"); fscanf(file,"%ls,%ls",&i,&j); fclose(file); printf("i = %d : j = %d\n",i,j); return 0; } とすれば最初の1行目だけは読めますが、それ以降がわかりません。 配列を使えばいいのでしょうか?

  • C言語のプログラムに関する質問です。

    C言語初心者で困っています。 SNをサンプリング数、FNをファイル数として、テキストファイルの1行目のデータ(kari[0])と2行目のデータ(kari[1])をそれぞれCH1、CH2に読み込むような以下のようなプログラムがあります。 ------------------------------------------ //読込みファイル名の設定// for(j=1;j<FN+1;j++){ sprintf(file_name,"%s%d%s",file,j,".txt"); printf("%d%s\n",j,file_name); if ((fp = fopen(file_name, "r")) == NULL){ printf("Error: Can't open file; %s\n", file_name); } //データの読込み// for(i=0;i<SN;i++){ fscanf(fp,"%lf,%lf\n",&kari[0],&kari[1]); ch1[i]=kari[0]; ch2[i]=kari[1]; } fclose(fp);       ・       ・       ・ fclose(fp); } ---------------------------------------------- しかし、テキストファイルの初めの3行には不必要な文字列が存在するため、4行目から読み込むように設定したいのですが、やり方がよく分かりません。 どのようにプログラムを書き換えれば良いか、教えていただけると助かります。 よろしくお願いします。

  • CSVファイル読込みのエラーに関して??

    下にプログラムの一部を書いてます。 このプログラムでは、b[g]にあたるCSVファイルを読み、 csv_value[j4][i4]に格納しようとしています。 しかし、すべての列で1列目の値が配列に格納されてしまいました。 間違いがわからずに困っています。 もし詳しい方がいましたら教えていただけないでしょうか? どうかよろしくお願いいたします。 char b[1000][50]; long g; long i4; long j4; char str0[500000]; long line_number; g=0; fp = fopen(b[g],"r"); for(i4=0;i4<line_number;i4++){ fgets(str0,500000,fp); for (j4=0;j4<32;j4++){ csv_value[j4][i4]=atoi(strtok(str0,",")); } }

  • C言語のfopenについて教えてください。

    C言語のfopenについて教えてください。 ある1つのファイルをr(テキストファイル読み込みモード)でfopenしたとします。 そのファイルをfcloseする前に、同じファイルが再度rモードでfopenされても問題ないのでしょうか? 何を気にしているかと言いますと、あるプログラムであるファイルをrモードでfopenして読み込む処理があるのですが、そのプログラムを呼び出す処理が複数あります。 確率は低いと言えど、もし同時にその処理が実行された場合、rモードでfopenしているファイルにfclose前に再度rモードのfopenがされたらエラーとなってしまうのでしょうか? もし、エラーとなる場合、回避する方法がありますか? また、エラーとならない場合は、fcloseするまで次の処理が待ってしまうのでしょうか? 読み込みモードだから問題ないのかなとも思ったのですが、どなたかご存知だったら教えてください。 よろしくお願いしますm(_ _)m