// CSV ファイルを扱うための補助ソース #include #include #include #include #include #include static char *filebuff,**linehead; static int filesize; static int linecount; #define TSLEN 1024 static char tempstr[TSLEN]; int LoadCSV(char *filename) { struct stat st; FILE *fp; int i; filesize=-1; if(stat(filename,&st)<0) { printf("ファイル '%s' が見つかりません.\n",filename); return -1; } printf("ファイル '%s' のサイズ:%d\n",filename,st.st_size); filebuff=(char *)malloc(st.st_size+1); if(filebuff==NULL) { printf("メモリが確保できません(%d byte).\n",filename,st.st_size); return -1; } filebuff[st.st_size]='\0'; // 止め fp=fopen(filename,"r"); if(fp==NULL) { printf("ファイル '%s' を開けません.\n",filename); free(filebuff); return -1; } if(fread(filebuff,st.st_size,1,fp)!=1) { printf("ファイル '%s' からデータを読めませんでした.\n",filename); free(filebuff); return -1; } filesize=st.st_size; printf("ファイルを読み込みました\n"); // 解析 linecount=0; for(i=0;i>%s|\n",linehead[i]); return 0; } enum { EXA=1,EXB,EXC,EXD,EXE,EXF,EXG, EXH,EXI,EXJ,EXK,EXL,EXM,EXN, EXO,EXP,EXQ,EXR,EXS,EXT,EXU, EXV,EXW,EXX,EXY,EXZ, }; char *Cell(int col,int raw) { int cc,i; char *p,*p2,*h; if(linecount<1) { printf("ファイルが正常に読み込めていないので強制終了します\n"); exit(1); } if((col<1)||(col>26)) { printf("列指定に問題があります.(EXA(1)-EXZ(26))\n"); return NULL; } if(raw<1) { printf("行指定に問題があります.(1-)\n"); return NULL; } raw--; if(raw>=linecount) { printf("元ファイルにそこまでデータありません(ファイルは%d行)\n",linecount); return NULL; } p=linehead[raw]; cc=1; h=p; while((*p)&&(col>cc)) { if((*p=='\"')&&(*h=='\"')) { for(p++;*p;p++) if(*p=='\"') { p++; break; } } if(*p==',') { cc++; h=p+1; } p++; } if(*p=='\0') { printf("%d 行には %d 個のデータがありません\n",raw+1,col); return NULL; } p=h; p2=tempstr; for(i=0;i>%s|\n",col-1+'A',raw+1,p2); return p2; } double Value(int col,int raw) { char *p=Cell(col,raw); char *p2; double val; if(p==NULL) return 0; val=strtod(p, &p2); if(p2==p) printf("セル%C%dは数値と認識できません\n",col-1+'A',raw); // printf(">>>>%f\n",val); return val; } int main_check(void) { LoadCSV("lmsdata.csv"); Value(EXA,1); Value(EXB,1); Value(EXC,1); Value(EXF,1); Value(EXA,15); Value(EXB,15); Value(EXC,15); Value(EXA,30); return 0; }