• ベストアンサー

C言語でcsvファイルの日別の金額を足し合たいんですが..

csvファイルのフィールドが15あるうちの2番目に日にち、15番目に金額が書いてあり、日にちには同じ日がいくつもあるので、その金額をそれぞれ足し合わせたものを出力するというものをやろうとしているのですが、C初心者何ですけど一応書いたプログラムが #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> int main(void) { char buffer1[512], buffer2[512],*p,*tp; FILE *fp; int i,j,num,sum; clock_t start,end; start = clock(); fp=fopen("j0.csv","r"); if(fp == NULL){ printf("ファイルが開けませんでした。\n"); exit(-1); } sum=0; while(fgets(buffer1,256,fp)!=NULL && fgets(buffer2,256,fp)!=NULL){ tp = strchr(buffer1, ','); p = strchr(buffer2, ','); tp = strchr(p+1, ','); for(j=0;j<13;j++) p = strchr(p+1, ','); num=atoi(p+1); sum+=num; if(tp==tp+1); sum+=atoi(p+1); else{ printf("%cでは%d円であった。\n",tp,sum); sum=0; } } return 0; } こんな感じなんですが、どうかご指導御願いします。

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

  • ベストアンサー
回答No.3

九州の半導体業界不振による派遣切りで暇人な私が組んでみた。。。 ちなみに、shift-jis等の処理は考慮していないし、日付データが1000件を超えた場合も何もしていません。 ----source code----- typedef struct scsvdat{  char chr[32][1024]; }SCSVDAT; typedef struct sdatesum {  char date[32];  long sum; }SDATESUM; SCSVDAT csvResolution(char *buf); int main() {  FILE *fp;  int cnt;  char buffer[1024];  SCSVDAT dat;  SDATESUM sumdat[1024] = {0};  fp = fopen("j0.csv","r");  if(fp == NULL){   printf("ファイルが開けませんでした。\n");   return(0);  }  while(fgets(buffer,sizeof(buffer),fp) != NULL){   dat = csvResolution(buffer);   for (cnt = 0 ; cnt < 1024 ; cnt++) {    if(strcmp(sumdat[cnt].date,dat.chr[1]) == 0) {     sumdat[cnt].sum += atoi(dat.chr[14]);     break;    }    if(sumdat[cnt].date[0] == '\0') {     strcpy (sumdat[cnt].date,dat.chr[1]);     sumdat[cnt].sum = atoi(dat.chr[14]);     break;    }   }  }  fclose(fp);  for (cnt = 0 ; cnt < 1024 ; cnt++) {   if(sumdat[cnt].date[0] == '\0') break;   printf("%sでは%d円であった。\n",sumdat[cnt].date,sumdat[cnt].sum);  }  fflush(stdout);  return(0); } SCSVDAT csvResolution(char *buf) {  int bcnt, rcnt, mcnt;  SCSVDAT dat = {0};  bcnt = rcnt = mcnt= 0;  for(;;) {   if (buf[bcnt] == '\0') break;   if (buf[bcnt] == ',') {    rcnt++;    mcnt = 0;   } else {    dat.chr[rcnt][mcnt] = buf[bcnt];    mcnt++;   }   bcnt++;  }  return dat; } ----用意したcsv---- aho,20090809,2,3,4,5,6,7,89,9,0,0,0,8,9 baka,20090101,4,4,426,32,345,3,,453,4,4,5,2,3 tonti,20090809,,,,,,,,,,,,,1

yxia001
質問者

お礼

すごいです。ちゃんと金額が出てきました。 自分のお粗末さが身にしみました。勉強のために、このプログラムを一個一個分解して理解して見たいと思います。

その他の回答 (3)

noname#243537
noname#243537
回答No.4

・日にちおよび金額は数字のみ ・カンマは \, や "," のように使われていない ・必ず一行に15項目以上ある 以上の仮定で書いてみました。 #include<stdio.h> int main(){ int day, i; double money, moneyOfDay[32] = {0}; FILE* f = fopen("j0.csv","r"); if(!f){printf("ファイルが開けませんでした。\n"); return 1;} for(;fscanf(f, "%*[^,],%d,%*[^,],%*[^,],%*[^,],%*[^,],%*[^,],%*[^,],%*[^,],%*[^,],%*[^,],%*[^,],%*[^,],%*[^,],%lf%*[^\n]%*c", &day, &money) == 2;) moneyOfDay[day] += money; for(i = 1; i <= 31; ++i)printf("%dでは%.0fであった。\n", i, moneyOfDay[i]); fclose(f); }

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> どうかご指導御願いします。 これではダメです。

回答No.1

ここ数日、同じような質問が多いのですが、学校の課題か何かでしょうか? >こんな感じなんですが、どうかご指導御願いします。 それで、「実行した結果」はどうなりましたか? どういったことを想定していて、結果としてどうなりましたか?