|

楼主 |
发表于 2020-4-2 21:11:41
|
显示全部楼层
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <stddef.h>
- #include <malloc.h>
- #include <float.h>
- #include <errno.h>
- typedef unsigned long long intll;
- FILE* fileptr(char* file, char* mode);
- void scantext(FILE* fp, intll* inu, intll* isize);
- void getname(FILE* fp, char* name, intll si);
- void getdata(FILE* fp, double* max, double* min, double* avg, double* sum, double* count, intll ns, intll nl, char* max_n, char* min_n);
- #define Lines 1024
- static char temp[Lines];
- static char const delim[]=",";
- int main(void)
- {
- //FILE* fpi=fileptr("TWII.csv","rb");
- FILE* fpi=fileptr("tes.csv","rb");
- FILE* fpo=fileptr("result.csv","wb");
- static intll inu,isize;
- scantext(fpi,&inu,&isize);
-
- char* iname=(char*)calloc(inu,sizeof(char)*isize);
- char* max_n=(char*)calloc(inu,sizeof(char)*isize);
- char* min_n=(char*)calloc(inu,sizeof(char)*isize);
- getname(fpi, iname, isize);
-
- double* max=(double*)calloc(inu,sizeof(double));
- double* min=(double*)calloc(inu,sizeof(double));
- double* avg=(double*)calloc(inu,sizeof(double));
- double* sum=(double*)calloc(inu,sizeof(double));
- double* count=(double*)calloc(inu,sizeof(double));
- register intll i=0;
- for (i=0;i<inu;i++) *(min+i)=DBL_MAX, *(max+i)=LDBL_MIN;
-
- getdata(fpi, max, min, avg, sum, count, isize, inu, max_n, min_n);
- fprintf(fpo,"Item,Count,Max,Max_Date,Min,Min_Date,Sum,Avg\r\n");
- for (i=0;i<inu-1;i++) fprintf(fpo,"%s,%.0lf,%.6lf,%s,%.6lf,%s,%.6lf,%.6lf\r\n",\
- iname+(i+1)*isize,*(count+i),*(max+i),max_n+i*isize,*(min+i),min_n+i*isize,*(sum+i),*(avg+i));
-
- free(iname);
- free(max);
- free(min);
- free(avg);
- free(sum);
- free(count);
- free(max_n);
- free(min_n);
- fclose(fpi);
- fclose(fpo);
- return 0;
- }
- FILE* fileptr(char* file, char* mode)
- {
- FILE* fp = fopen(file,mode);
- if (fp == NULL)
- {
- printf("open file fail!:%s",strerror(errno));
- exit(EXIT_FAILURE);
- }
- return fp;
- }
- void scantext(FILE* fp, intll* inu, intll* isize)
- {
- //读取两行取最大值
- rewind(fp);
- fgets(temp,Lines,fp);
- register intll i=0;
- char *p;
- p=strtok(temp,delim);
- while(p != NULL)
- {
- i++;
- *isize=strlen(p) > *isize ? strlen(p)+1 : *isize;
- p=strtok(NULL,delim);
- }
- fgets(temp,Lines,fp);
- p=strtok(temp,delim);
- while(p != NULL)
- {
- *isize=strlen(p) > *isize ? strlen(p)+1 : *isize;
- p=strtok(NULL,delim);
- }
- *inu=i;
- }
- void getname(FILE* fp, char* name, intll si)
- {
- rewind(fp);
- fgets(temp,Lines,fp);
- char* p=strtok(temp,delim);
- register intll i=0,l;
- while (p != NULL)
- {
- strcpy(name+i*si,p);
- p=strtok(NULL,delim);
- i++;
- }
- //去掉最后一列换行符;
- i--;
- l=strlen(name+i*si);
- while (l--)
- if (*(name+i*si+l) == 0xA || *(name+i*si+l) == 0xD)
- *(name+i*si+l) = '\0';
- else break;
- }
- void getdata(FILE* fp, double* max, double* min, double* avg, double* sum, double* count, intll ns, intll nl, char* max_n, char* min_n)
- {
- rewind(fp);
- fgets(temp,Lines,fp);
-
- register double t=0;
- register intll i=0;
- register intll cou=0;
- char *p=NULL;
- char *pb=NULL;
-
- while (fgets(temp,Lines,fp))
- {
- cou++;
- i=0;
- p=pb=strtok(temp,delim);
- do
- {
- p=strtok(NULL,delim);
- if (p == NULL) break;
- t=atof(p);
- if (t > *(max+i))
- {
- *(max+i) = t;
- memmove(max_n+i*ns,pb,strlen(pb));
- *(max_n+i*ns+strlen(pb))='\0';
- }
- if (t < *(min+i))
- {
- *(min+i) = t;
- memmove(min_n+i*ns,pb,strlen(pb));
- *(min_n+i*ns+strlen(pb))='\0';
- }
- *(sum+i)+=t;
- i++;
- }while (1);
- }
- register intll j;
- for (j=0; j<nl-1; j++)
- {
- if (j < i) *(avg+j)=*(sum+j)/cou,*(count+j)=cou;
- else *(avg+j)=*(sum+j)/(cou-1),*(count+j)=cou-1;
- }
- }
复制代码 |
|