鱼C论坛

 找回密码
 立即注册
查看: 1209|回复: 3

[技术交流] 这也太快了吧!!!处理csv文档(求和,平均数,最大数,最小数)3W多行1秒就搞定了!

[复制链接]
发表于 2020-2-19 18:50:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Cool_Breeze 于 2020-2-21 09:08 编辑
//编译器 Dev-C++  5.11

#include <stdio.h>
#include <string.h> 
#include <stdlib.h>
#define SUN_X 50        //存储数据大小 
int max=10240;
char tempc[1000][50]={0};
char (*t_p)[50]=tempc;
double dou_sum[32]={0};  //待处理数据个数 
int nu=0;

void delims(char *ser,char res[][SUN_X],int n);  //n=计数 
FILE *file_p(char *path,const char *mode);

int main(int argv,char *argc[])
{
        FILE *fp;
        FILE *b_txt;
        fp=file_p(argc[1],"r");                  //源文件 
        b_txt=file_p(argc[2],"w");                             //结果 
        char arr[max];
        char name[100][SUN_X]={0};
        char (*p)[SUN_X]=name;
        fgets(arr,max,fp);
        delims(arr,name,nu);                     //将第一行的标题单独存放 
        int i=0,k=0,j=0,count=0;
        double min[SUN_X]={0},max_1[SUN_X]={0};   //最大值,最小值
        while (fgets(arr,max,fp)!=NULL)
        {
                nu=0;
                count++;
                delims(arr,tempc,nu);
                for (i=1;*(*(t_p+i)+0)!='\0';i++)    //(i=1)跳过第一列的数据 
                {
                        if (i<=nu) dou_sum[i-1]+=atof(*(t_p+i));    //将每一项数据相加         
                        if (count==1)
                        { 
                                min[i-1]=atof(*(t_p+i));         //最少值(初始化)        
                                max_1[i-1]=atof(*(t_p+i));   //最大值(初始化)        
                        }
                        else
                        {
                                if (atof(*(t_p+i)) > max_1[i-1]) max_1[i-1]=atof(*(t_p+i));  //最大值 
                                if (atof(*(t_p+i)) < min[i-1]) min[i-1]=atof(*(t_p+i));      //最小值 
                        }
                }
        }
        //printf("%d\t%d",nu,count);
        double avg[SUN_X]={0};      //平均值 
        for (i=0;*(*(p+i+1)+0)!='\0';i++) 
        {
                if (i<nu) avg[i]=dou_sum[i]/count;   //最后一行 
                else
                {
                        avg[i]=dou_sum[i]/(count-1);
                }
        }
        p=name; 
        //打印表格 
        /*
        char b_ge[33]="+------------------------------+" ;
        char b_ge1[22]="--------------------+" ;
        fprintf(b_txt,"%s%s%s%s%s\n|%-30s|%-20s|%-20s|%-20s|%-20s|\n",b_ge,b_ge1,b_ge1,b_ge1,b_ge1,"Item","Sum","Min","Max","Avg");
        for (i=0;*(*(p+i+1)+0)!='\0';i++) fprintf(b_txt,"%s%s%s%s%s\n|%-30s|%-20f|%-20f|%-20f|%-20f|\n",b_ge,b_ge1,b_ge1,b_ge1,b_ge1,*(p+i+1),dou_sum[i],min[i],max_1[i],avg[i]);  //(p+i+1)跳过第一列的数据 
        fprintf(b_txt,"%s%s%s%s%s",b_ge,b_ge1,b_ge1,b_ge1,b_ge1);
        */
        fprintf(b_txt,"%-30s%-20s%-20s%-20s%-20s\n","Item","Sum","Min","Max","Avg");
        for (i=0;*(*(p+i+1)+0)!='\0';i++) fprintf(b_txt,"%-30s%-20lf%-20f%-20f%-20lf\n",*(p+i+1),dou_sum[i],min[i],max_1[i],avg[i]);  //(p+i+1)跳过第一列的数据 
        fclose(fp);
        fclose(b_txt);
        return 0;
}
//分割每一项放到数组tempc 
void delims(char *ser,char res[][SUN_X],int n)
{
        int j=0,k=0,i=0;
        for (;ser[i]!='\0';i++)
        {
                if (ser[i]!=',' && ser[i]!=' ') 
                {
                        res[j][k]=ser[i];        
                        k++;
                }
                if (ser[i]==',')
                {
                        res[j][k]='\0';
                        j++,nu++,k=0;
                }
                if (ser[i+1]=='\0') res[j][k-1]='\0';  //把最后一个符号替换 
        }
}
FILE *file_p(char *path,const char *mode)
{
        FILE *fp;
        if ((fp=fopen(path,mode))==NULL)
        {
                printf("%s open faile!",path);
                exit(0);
        }
        return fp;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-19 18:51:17 | 显示全部楼层
本帖最后由 Cool_Breeze 于 2020-3-15 18:44 编辑

结果如下:
Nu Item                                Max             Min             Sum             Avg             
 1  GPU Temperature (C) [0] (C)        74.62657        40.57681        8499.02069      67.99217        
 2  Junction Temperature (C) [0] (C)   84.05241        40.58622        9719.54632      77.75637        
 3  Mem Temperature (C) [0] (C)        84.00000        42.00000        8998.64532      71.98916        
 4  VR_GFX (C) [0] (C)                 60.00000        33.00000        6346.72336      50.77379        
 5  VR_SOC (C) [0] (C)                 58.00000        34.00000        6074.32725      48.59462        
 6  VR_MEM (C) [0] (C)                 0.00000         0.00000         0.00000         0.00000         
 7  VR_VDDCI (C) [0] (C)               0.00000         0.00000         0.00000         0.00000         
 8  Liquid0 (C) [0] (C)                0.00000         0.00000         0.00000         0.00000         
 9  Liquid1 (C) [0] (C)                0.00000         0.00000         0.00000         0.00000         
10  PLX (C) [0] (C)                    0.00000         0.00000         0.00000         0.00000         
11  Min (C) [0] (C)                    65.23669        38.50471        7491.50144      59.93201        
12  GFXCLK Freq [0] ()                 1553.07312      783.68744       187591.28837    1500.73031      
13  PWM [0] ()                         43.73852        0.00000         4269.58901      34.15671        
14  FAN Speed [RPM] [0] ()             1716.95959      124.55509       167371.82184    1338.97457      
15  Limit PPT0 (W) [0] (W)             165.00000       165.00000       20625.00000     165.00000       
16  Value PPT0 (W) [0] (W)             165.00716       9.41742         19857.86155     158.86289       
17  GFX Activity (%) [0] (%)           97.66265        0.10941         11638.45836     93.10767        
18  PCIe Link Speed (GT/s) [0] (GT/s)  8.00000         8.00000         1000.00000      8.00000         
19  PCIe Link Width [0] ()             16.00000        16.00000        2000.00000      16.00000        
20  PCIe Correctable Error [0] ()      0.00000         0.00000         0.00000         0.00000         
21  PCIe Uncorrectable Error [0] ()    0.00000         0.00000         0.00000         0.00000         
22  PCIe Residency Gen 1 (%) [0] (%)   60.00000        0.00000         336.84718       2.69478         
23  PCIe Residency Gen 2 (%) [0] (%)   0.00000         0.00000         0.00000         0.00000         
24  PCIe Residency Gen 3 (%) [0] (%)   100.00000       40.00000        12163.15287     97.30522        
25  PCIe Residency Gen 4 (%) [0] (%)   0.00000         0.00000         0.00000         0.00000         
26  PCIe Residency L0 (%) [0] (%)      100.00000       100.00000       12500.00000     100.00000       
27  PCIe Residency L0s (%) [0] (%)     0.00000         0.00000         0.00000         0.00000         
28  PCIe Residency L1 (%) [0] (%)      0.00000         0.00000         0.00000         0.00000         
29  Fan PWM reading [%] [0] (%)        44.00000        0.00000         4286.00000      34.28800        
30  mclk[0] (MHz)                      876.00000       101.00000       105924.00000    854.22581       
31  sclk[0] (MHz)                      1585.00000      781.00000       186631.00000    1505.08871      
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-19 18:53:35 | 显示全部楼层
本帖最后由 Cool_Breeze 于 2020-3-15 18:42 编辑
#if 0
        By Cool_Breeze
        Rev 01
        #endif 

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <float.h> 

//返回文件指针 
FILE* filepointer(const char *file,const char *mode);
/*
        获取文件第一行项目名总数和最大项目名长度存入数组 
        注意里面有个temp数组大小为1024 
*/ 
void getitemsum(FILE* fp,int *itemsize);
/*
        获取文件第一行的项目名放入数组 
        注意里面有个temp数组大小为1024 
*/
void getitemname(FILE* fp,char *name,int num);
/*
        读取每一行数据,按格式分割后放入指定数组 
        注意里面有个temp数组大小为1024 
*/ 
void getdata(FILE* fp,double* max,double* min,double* avg,double* sum,int itemnu);
int main(int argc,char *argv[])
{
        //第一个参数是原始文件,第二个参数是结果文件 
        FILE* sourcep=filepointer(argv[1],"rb");
        FILE* resultp=filepointer(argv[2],"wb");
        
        //获取文件大小 itemsize[0]储存个数 
        static int itemsize[2];
        getitemsum(sourcep,itemsize);
        //printf("itemnum=%d maxsize=%d\n",itemsize[0],itemsize[1]);
        
        //开辟项目名空间并赋值 
        char (*itemname)[itemsize[1]]=(char(*)[itemsize[1]])calloc(itemsize[0]*itemsize[1],sizeof(char));
        getitemname(sourcep,itemname[0],itemsize[1]);

        //分配最大值,最小值,求和,平均值空间
        double* max=(double*)calloc(itemsize[0],sizeof(double));
        double* min=(double*)calloc(itemsize[0],sizeof(double));
        double* avg=(double*)calloc(itemsize[0],sizeof(double));
        double* sum=(double*)calloc(itemsize[0],sizeof(double));
        //初始化最大值最小值 
        register int i=0;
        for (i=0;i<itemsize[0];i++) *(min+i)=DBL_MAX, *(max+i)=DBL_MIN;
        //获取相应数据
        getdata(sourcep,max,min,avg,sum,itemsize[0]);
        fprintf(resultp,"%2s  %-35s%-16s%-16s%-16s%-16s\n","Nu","Item","Max","Min","Sum","Avg");
        for (i=1;i<itemsize[0];i++) fprintf(resultp,"%2d %-36s%-16.5lf%-16.5lf%-16.5lf%-16.5lf\n",i,*(itemname+i),max[i],min[i],sum[i],avg[i]);
        
        return 0;
}
FILE* filepointer(const char *file,const char *mode)
{
        FILE *fp;
        if (!(fp = fopen(file,mode)))
        {
                printf("open fail! %s\n",file);
                exit(-2);
        }
        return fp;
} 
void getitemsum(FILE* fp,int *itemsize)
{
        char temp[1024]={"\0"};//临时储存一行数据 
        char *tep=temp;
        register int i=0;//项目 
        register int m=0;//最大长度 
        register int t=0;//临时 
        fgets(temp,1024,fp);
        for (;*tep;tep++)
        {
                switch (*tep)
                {
                        case ',': i++,t=0;break;//项目加一,长度归零 
                        case '\n': i++;*itemsize=i;*(itemsize+1)=m+1;return;//(m+1)给最后‘\0’留个位置,最后赋值退出 
                        default : t++;
                        if (t>m) m=t;//始终保持最大长度 
                }
        }
}
void getitemname(FILE *fp,char *name,int num)
{
        rewind(fp);
        char temp[1024]={"\0"};//临时储存一行数据 
        char *tep=temp;
        register int i=0;//第一维 
        register int j=0;//第二维
        fgets(temp,1024,fp);
        for (;*tep;tep++)
        {
                switch (*tep)
                {
                        case ',':i++,j=0;break;
                        case 10:break;//换行 
                        case 13:break;//回车 
                        default :*(name+i*num+j)=*tep;j++;
                }
        }
}
void getdata(FILE* fp,double* max,double* min,double* avg,double* sum,int itemnu)
{
        rewind(fp);
        char temp[1024]={"\0"};//临时储存一行数据 
        char *tep=temp;
        register double fdata=0;//储存临时数据
        register int i=1;//数组下标(空出第一列数据待后期使用) 
        register int count=0;//统计行数 
        fgets(tep,1024,fp);//跳过第一行项目数据 
        while ( !feof(fp) )
        {
                count++; 
                fgets(temp,1024,fp);
                i=1;
                tep=temp;
                while (*tep)
                {
                        if (*(tep++) == ',')
                        {
                                fdata=atof(tep);
                                if (fdata > *(max+i)) *(max+i)=fdata;
                                if (fdata < *(min+i)) *(min+i)=fdata;
                                *(sum+i) += fdata;
                                i++;
                        }
                }
        }
        //处理最后一行因有可能出现不完整的数据所导致平均数据不准确
        register int n;
        if (i < itemnu)
        {
                for (n=1;n<itemnu;n++)
                {
                        if (n >= i) *(avg+n)=*(sum+n)/(count-1);
                        else *(avg+n)=*(sum+n)/count;
                } 
        }
        else for (n=1;n<itemnu;n++) *(avg+n)=*(sum+n)/count;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-19 19:31:48 | 显示全部楼层
本帖最后由 Cool_Breeze 于 2020-2-20 20:03 编辑

csv文档内容如下:
time stamp, GPU Temperature (C) [0] (C), Junction Temperature (C) [0] (C), Mem Temperature (C) [0] (C), VR_GFX (C) [0] (C), VR_SOC (C) [0] (C), VR_MEM (C) [0] (C), VR_VDDCI (C) [0] (C), Liquid0 (C) [0] (C), Liquid1 (C) [0] (C), PLX (C) [0] (C), Min (C) [0] (C), GFXCLK Freq [0] (), PWM [0] (), FAN Speed [RPM] [0] (), Limit PPT0 (W) [0] (W), Value PPT0 (W) [0] (W), GFX Activity (%) [0] (%), PCIe Link Speed (GT/s) [0] (GT/s), PCIe Link Width [0] (), PCIe Correctable Error [0] (), PCIe Uncorrectable Error [0] (), PCIe Residency Gen 1 (%) [0] (%), PCIe Residency Gen 2 (%) [0] (%), PCIe Residency Gen 3 (%) [0] (%), PCIe Residency Gen 4 (%) [0] (%), PCIe Residency L0 (%) [0] (%), PCIe Residency L0s (%) [0] (%), PCIe Residency L1 (%) [0] (%), Fan PWM reading [%] [0] (%), mclk[0] (MHz), sclk[0] (MHz)
13:05:30.982, 44.76316, 44.90789, 44.00000, 32.00000, 34.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 41.50000, 796.31171, 0.00000, 170.52246, 165.00000, 32.85556, 0.00000, 8.00000, 16.00000, 0.00000, 0.00000, 0.00000, 0.00000, 100.00000, 0.00000, 100.00000, 0.00000, 0.00000, 0.00000, 876.0,  795.0
13:05:32.007, 45.06062, 45.18257, 44.00000, 32.00000, 34.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 41.59981, 795.48145, 0.00000, 170.52138, 165.00000, 33.75420, 5.10389, 8.00000, 16.00000, 0.00000, 0.00000, 30.00000, 0.00000, 70.00000, 0.00000, 100.00000, 0.00000, 0.00000, 0.00000, 876.0,  796.0
13:05:33.011, 44.37386, 44.41244, 44.00000, 32.00000, 34.20508, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 41.49569, 793.17987, 0.00000, 170.52162, 165.00000, 26.42430, 13.97832, 8.00000, 16.00000, 0.00000, 0.00000, 20.00000, 0.00000, 80.00000, 0.00000, 100.00000, 0.00000, 0.00000, 0.00000, 501.0,  772.0
13:05:34.018, 52.29150, 62.84890, 47.36978, 32.61133, 34.75348, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 45.68688, 1579.41577, 12.67473, 175.16473, 165.00000, 149.90047, 96.07919, 8.00000, 16.00000, 0.00000, 0.00000, 13.33333, 0.00000, 86.66666, 0.00000, 100.00000, 0.00000, 0.00000, 15.00000, 876.0,  1564.0
13:05:35.022, 55.09911, 66.63048, 52.26693, 33.59263, 35.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 47.97585, 1589.96985, 14.84375, 969.44452, 165.00000, 164.99840, 96.58652, 8.00000, 16.00000, 0.00000, 0.00000, 10.00000, 0.00000, 90.00000, 0.00000, 100.00000, 0.00000, 0.00000, 15.00000, 876.0,  1612.0
13:05:36.025, 55.81506, 67.23206, 54.00000, 34.48455, 35.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 48.74975, 1599.06433, 14.84375, 980.06689, 165.00000, 165.00172, 95.87738, 8.00000, 16.00000, 0.00000, 0.00000, 8.00000, 0.00000, 92.00000, 0.00000, 100.00000, 0.00000, 0.00000, 15.00000, 876.0,  1576.0
13:05:37.054, 56.04808, 67.51455, 54.00000, 35.00000, 35.38462, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 49.24310, 1584.18787, 14.84375, 670.29089, 165.00000, 164.99924, 97.36720, 8.00000, 16.00000, 0.00000, 0.00000, 6.66667, 0.00000, 93.33334, 0.00000, 100.00000, 0.00000, 0.00000, 15.00000, 876.0,  1589.0
13:05:38.071, 56.32507, 68.00413, 55.19534, 35.84062, 36.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 49.70335, 1580.33801, 14.97964, 543.21606, 165.00000, 164.94023, 97.04283, 8.00000, 16.00000, 0.00000, 0.00000, 5.79710, 0.00000, 94.20290, 0.00000, 100.00000, 0.00000, 0.00000, 15.00000, 876.0,  1580.0
13:05:39.076, 56.74975, 68.43750, 56.00000, 36.00000, 36.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 50.17928, 1591.44324, 15.47805, 630.68823, 165.00000, 165.00043, 95.92555, 8.00000, 16.00000, 0.00000, 0.00000, 5.06329, 0.00000, 94.93671, 0.00000, 100.00000, 0.00000, 0.00000, 16.00000, 876.0,  1563.0
13:05:40.082, 57.12053, 68.73981, 56.00000, 36.89761, 36.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 50.59045, 1573.54883, 15.98904, 767.91388, 165.00000, 165.00099, 98.35493, 8.00000, 16.00000, 0.00000, 0.00000, 4.49438, 0.00000, 95.50562, 0.00000, 100.00000, 0.00000, 0.00000, 16.00000, 876.0,  1572.0
13:05:41.085, 57.46012, 69.12787, 56.00000, 37.00000, 36.76171, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 50.92173, 1578.60803, 16.50296, 814.84827, 165.00000, 164.99835, 98.22034, 8.00000, 16.00000, 0.00000, 0.00000, 4.04040, 0.00000, 95.95959, 0.00000, 100.00000, 0.00000, 0.00000, 16.00000, 876.0,  1574.0
13:05:42.116, 57.74286, 69.49188, 56.00000, 37.62008, 37.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 51.34399, 1576.09644, 17.13105, 778.23401, 165.00000, 165.00224, 97.72848, 8.00000, 16.00000, 0.00000, 0.00000, 3.66972, 0.00000, 96.33028, 0.00000, 100.00000, 0.00000, 0.00000, 17.00000, 876.0,  1585.0
13:05:43.149, 58.10330, 69.82226, 57.30941, 38.00000, 37.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 51.73957, 1576.54688, 17.82505, 795.29156, 165.00000, 164.99890, 97.53688, 8.00000, 16.00000, 0.00000, 0.00000, 3.36134, 0.00000, 96.63866, 0.00000, 100.00000, 0.00000, 0.00000, 18.00000, 876.0,  1565.0
13:05:44.158, 58.45005, 70.16307, 58.00000, 38.37414, 37.31342, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 52.08913, 1588.35925, 18.52103, 859.73132, 165.00000, 164.99612, 96.32578, 8.00000, 16.00000, 0.00000, 0.00000, 3.12500, 0.00000, 96.87500, 0.00000, 100.00000, 0.00000, 0.00000, 19.00000, 876.0,  1608.0
13:05:45.195, 58.72681, 70.47998, 58.00000, 39.00000, 38.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 52.41504, 1577.53979, 19.21621, 889.65686, 165.00000, 165.00304, 97.21816, 8.00000, 16.00000, 0.00000, 0.00000, 2.89855, 0.00000, 97.10145, 0.00000, 100.00000, 0.00000, 0.00000, 20.00000, 876.0,  1571.0
13:05:46.229, 59.00315, 70.71370, 58.00000, 39.00000, 38.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 52.76162, 1575.31543, 19.95393, 907.09454, 165.00000, 165.00052, 97.43172, 8.00000, 16.00000, 0.00000, 0.00000, 2.72109, 0.00000, 97.27891, 0.00000, 100.00000, 0.00000, 0.00000, 20.00000, 876.0,  1564.0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 01:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表