[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

这也太快了吧!!!c处理csv文件(求和,平均值,最大值,最小值)3W多行秒处理!

本帖最后由 Gin_Q 于 2020-2-27 10:09 编辑

命令行用法:D:\GIN\c\test>csv分析.exe source.csv result.txt 1
  1. //编译器 Dev-C++  5.11
  2. //Rev 02
  3. //Author By Gin
  4. //增加打印格式
  5. //.cpp
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <stdlib.h>
  9. int main(int argv,char *argc[])
  10. {
  11. int delims(char *ser,char *res,int res_size);
  12. FILE *file_p(char *path,const char *mode);
  13. void form_printf(FILE *fp,char *item,double *sum,double *min,double *max_1,double *avg,int width,int T_max,int off);
  14. int check_width(FILE *fp);
  15. int check_high(FILE *fp);
  16. FILE *source_txt=file_p(argc[1],"r"); //源文件
  17. FILE *result_txt=file_p(argc[2],"w"); //结果
  18. int off=atoi(argc[3]); //输出结果格式
  19. int width=check_width(source_txt);        //文件列数统计
  20. int high=check_high(source_txt);        //文件行数统计
  21. int Max=10240,T_max=50;
  22. char temp[width][T_max]; //用于临时储存一行数据 (用于atof转换)
  23. char item[width][T_max]={"0"}; //储存数据项目名
  24. char line_size[Max]="0"; //储存一行数据空间
  25. double sum[width]={0}; //储存一行数据
  26. int nu_line=0; //用来储存文件一行数据个数
  27. rewind(source_txt);
  28. fgets(line_size,Max,source_txt);
  29. delims(line_size,item[0],T_max);                     //将第一行的标题单独存放
  30. int i=0,k=0,j=0,count=0;
  31. double min[width]={0},max_1[width]={0};   //最大值,最小值
  32. while (fgets(line_size,Max,source_txt)!=NULL)
  33. {
  34. count++;
  35. nu_line=delims(line_size,temp[0],T_max);
  36. for (i=1;*(temp[i])!='\0';i++)    //(i=1)跳过第一列的数据
  37. {
  38. if (i<nu_line) sum[i-1]+=atof(temp[i]);    //将每一项数据相加
  39. if (count==1)
  40. {
  41. min[i-1]=atof(temp[i]); //最少值(初始化)
  42. max_1[i-1]=atof(temp[i]);   //最大值(初始化)
  43. }
  44. else
  45. {
  46. if (atof(temp[i]) > max_1[i-1]) max_1[i-1]=atof(temp[i]);  //最大值
  47. if (atof(temp[i]) < min[i-1]) min[i-1]=atof(temp[i]);      //最小值
  48. }
  49. }
  50. }
  51. double avg[width]={0};      //平均值
  52. for (i=0;i<width-1;i++)
  53. {
  54. if (i<nu_line-1) avg[i]=sum[i]/count;   //最后一行如果小于width
  55. else
  56. {
  57. avg[i]=sum[i]/(count-1);
  58. }
  59. }
  60. form_printf(result_txt,item[0],sum,min,max_1,avg,width,T_max,off);
  61. fclose(source_txt);
  62. fclose(result_txt);
  63. return 0;
  64. }
  65. int check_width(FILE *fp)
  66. {
  67. rewind(fp);
  68. char t;
  69. int w=1;
  70. for (;(t=fgetc(fp))!='\n';)
  71. {
  72. if (t==',') w++;
  73. }
  74. return w;
  75. }
  76. int check_high(FILE *fp)
  77. {
  78. rewind(fp);
  79. int h=0,size=10240;
  80. char temp[size]="0";
  81. for (;fgets(temp,size,fp)!=NULL;h++);
  82. return h-1; //去掉第一行
  83. }
  84. //分割数据
  85. int delims(char *sou,char *res,int res_size)
  86. {
  87. int j=0,k=0,i=0,n=0;
  88. for (;sou[i]!='\0';i++)
  89. {
  90. if (sou[i]!=',' && sou[i]!=' ')
  91. {
  92. *(res+j*res_size+k)=sou[i];
  93. k++;
  94. }
  95. if (sou[i]==',')
  96. {
  97. *(res+j*res_size+k)='\0';
  98. j++,n++,k=0;
  99. }
  100. if (sou[i+1]=='\0') *(res+j*res_size+k-1)='\0';  //把最后一个符号替换
  101. }
  102. return n+1; //加上最后一行
  103. }
  104. FILE *file_p(char *path,const char *mode)
  105. {
  106. FILE *fp;
  107. if ((fp=fopen(path,mode))==NULL)
  108. {
  109. printf("%s open faile!",path);
  110. exit(0);
  111. }
  112. return fp;
  113. }
  114. void form_printf(FILE *fp,char *item,double *sum,double *min,double *max_1,double *avg,int width,int T_max,int off)
  115. {
  116. int i=0;
  117. if (off==1)
  118. {
  119. char form='+';
  120. char form_1='|';
  121. char form_2[22]="---------------------" ;
  122. char form_3[32]="-------------------------------" ;
  123. fprintf(fp,"%c%s%c%s%c%s%c%s%c%s%c\n",form,form_3,form,form_2,form,form_2,form,form_2,form,form_2,form);
  124. fprintf(fp,"%c %-30s%c %-20s%c %-20s%c %-20s%c %-20s%c\n",form_1,"Item",form_1,"Sum",form_1,"Min",form_1,"Max",form_1,"Avg",form_1);
  125. fprintf(fp,"%c%s%c%s%c%s%c%s%c%s%c\n",form,form_3,form,form_2,form,form_2,form,form_2,form,form_2,form);
  126. for (i=0;i<width-1;i++) fprintf(fp,"%c %-30s%c %-20f%c %-20f%c %-20f%c %-20f%c\n",form_1,item+i*T_max+T_max,form_1,sum[i],form_1,min[i],form_1,max_1[i],form_1,avg[i],form_1);
  127. fprintf(fp,"%c%s%c%s%c%s%c%s%c%s%c\n",form,form_3,form,form_2,form,form_2,form,form_2,form,form_2,form);
  128. }
  129. else if (off==2)
  130. {
  131. char form='+';
  132. char form_1='|';
  133. char form_2[22]="---------------------" ;
  134. char form_3[32]="-------------------------------" ;
  135. fprintf(fp,"%c%s%c%s%c%s%c%s%c%s%c\n",form,form_3,form,form_2,form,form_2,form,form_2,form,form_2,form);
  136. fprintf(fp,"%c %-30s%c %-20s%c %-20s%c %-20s%c %-20s%c\n",form_1,"Item",form_1,"Sum",form_1,"Min",form_1,"Max",form_1,"Avg",form_1);
  137. for (i=0;i<width-1;i++) fprintf(fp,"%c%s%c%s%c%s%c%s%c%s%c\n%c %-30s%c %-20f%c %-20f%c %-20f%c %-20f%c\n",form,form_3,form,form_2,form,form_2,form,form_2,form,form_2,form,form_1,item+i*T_max+T_max,form_1,sum[i],form_1,min[i],form_1,max_1[i],form_1,avg[i],form_1);
  138. fprintf(fp,"%c%s%c%s%c%s%c%s%c%s%c\n",form,form_3,form,form_2,form,form_2,form,form_2,form,form_2,form);
  139. }
  140. else
  141. {
  142. fprintf(fp,"%-30s%-20s%-20s%-20s%-20s\n","Item","Sum","Min","Max","Avg");
  143. for (i=0;i<width-1;i++) fprintf(fp,"%-30s%-20f%-20f%-20f%-20f\n",item+i*T_max+T_max,sum[i],min[i],max_1[i],avg[i]);
  144. }
  145. }
复制代码

返回列表