- ベストアンサー
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; } こんな感じなんですが、どうかご指導御願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
九州の半導体業界不振による派遣切りで暇人な私が組んでみた。。。 ちなみに、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
その他の回答 (3)
・日にちおよび金額は数字のみ ・カンマは \, や "," のように使われていない ・必ず一行に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)
> どうかご指導御願いします。 これではダメです。
- SilverThaw
- ベストアンサー率32% (260/806)
ここ数日、同じような質問が多いのですが、学校の課題か何かでしょうか? >こんな感じなんですが、どうかご指導御願いします。 それで、「実行した結果」はどうなりましたか? どういったことを想定していて、結果としてどうなりましたか?
お礼
すごいです。ちゃんと金額が出てきました。 自分のお粗末さが身にしみました。勉強のために、このプログラムを一個一個分解して理解して見たいと思います。