2010-08-04 87 views
0

美好的一天。如何从文件中读取数据并清理并存储到文件中

我有一个文件,其中包含某些部分显示在下面的数据。它每三秒钟记录一次30天的记录。我想对数据执行以下操作。

2010-03-03 16:00:31; 66.89; 24.0; 14.89; 0.08; 

2010-03-03 16:00:35; 66.15; 24.1; 14.85; 0.08; 

2010-03-03 16:00:38; 67.10; 24.2; 14.81; 0.08; 

2010-03-03 16:00:42; 66.36; 24.3; 14.78; 0.08; 

2010-03-03 16:00:46; 65.83; 24.4; 14.75; 0.09; 
. 
. 
. 
2010-03-03 17:00:31; 62.78; 25.2; 13.96; 0.12; 

2010-03-03 17:00:35; 63.94; 25.3; 13.92; 0.11; 

2010-03-03 17:00:39; 61.94; 25.3; 13.89; 0.11; 

2010-03-03 17:00:43; 60.99; 25.4; 13.88; 0.12; 

2010-03-03 17:00:46; 62.67; 25.4; 13.89; 0.13; 

2010-03-03 17:00:50; 62.57; 25.3; 13.91; 0.13; 

2010-03-03 17:00:54; 61.51; 25.3; 13.91; 0.14; 
. 
. 
. 
2010-03-03 18:00:29; 66.04; 20.7; 13.63; 0.56; 

2010-03-03 18:00:33; 66.04; 20.7; 13.63; 0.56; 

2010-03-03 18:00:37; 65.52; 20.7; 13.59; 0.56; 

2010-03-03 18:00:40; 64.46; 20.7; 13.56; 0.56; 

2010-03-03 18:00:44; 64.88; 20.8; 13.56; 0.56; 
. 
. 
. 
  1. 阅读从第一行开始文件中的所有行。

2.对于每个小时,我想只计算第二列中的数据总和以及产生该总和的记录数。

3.And然后打印到文件中的以下信息:

i.Date;sum(1st hour),number of records that gave rise to this sum;sum(2nd hour),num_records;sum(3rd hour),num_records;...; sum total(24 hours),totol_records;mean 

这是我想要如上述那样打印到文件中的示例;

03\03\2010; 15093.47; 379; 16025.46; 380; 14800.58; 379; 14605.34; 380; 21754.27,379;...;82279.12,1897;43,37 

04\03\2010; 6842.051; 379; 7137.491; 380; 7215.16; 380; 7159.189; 379; 6594.672; 380;...;34948.56,1898;18,41 

05\03\2010; 9938.37; 379; 9670.438; 380; 8232.032; 380; 9198.899; 379; 7083.687; 380;...;44123.426,1898;23,25 

我已经开始使用此代码

int file_readline(char *file_in,char *outfile,char *strline) { 
    FILE *fd=NULL; 
    FILE *fo= NULL 
    char *date, *tmp,*time; 
    double sum=0; 
    double mean = 0; 
    strline=calloc(MAX_BUFFER_SIZE,sizeof(strline)); 
    if (strline==NULL) { 
     printf ("Error calloc strline................."); 
     exit(EXIT_FAILURE); 
    } 
    file_in = calloc((strlen(strline)+strlen(file_in)),sizeof(file_in)); 
    if (file_in==NULL) 
    { 
     printf ("Error calloc strline................."); 
     exit(EXIT_FAILURE); 
    } 
    fd=fopen(file_in,"r"); 
    int i = 0; 
    int j = 0; 
    while ((fgets (strline, BUFSIZ, fd))>0 && !feof(fd)){ 
     date = strtok(strline, " "); 
     time=strtok(NULL, " "); 
     tmp = strtok(NULL, ";"); 
     if (i == 3) { // get only the 3rd value 
      sum += strtod(tmp, NULL); 
      ++i; 
      // don't know how to proceed from here 
+3

为什么你想在C中做这个任何特定的原因?像Perl这样的脚本语言似乎更适合这样的任务。 – 2010-08-04 16:21:35

+1

你为什么要用C来做这样的工作?有很多替代品(例如,AWK,Perl)更适合这类任务,并且会使它变得非常简单。如果你需要某些东西(你没有在你的问题中提到过),那么C++会使它更简单一些,同时保留C – 2010-08-04 16:22:08

+0

甚至C#.NET的所有功能,使用Sebastian Lorion的Fast CSV读者:http://www.codeproject.com/KB/database/CsvReader.aspx – 2010-08-04 16:23:01

回答

0

我会通过对每行的数组接近这一点,然后通过数组解析,做你的计算,因为它看起来像你在做什么。它看起来像你的数据文件格式一致,所以不妨利用。将数组单元格存储在特定变量中,然后将它们转换为数学浮点数可能是最简单的方法。

0
enum {OUT,ADD}; 
void processline(int action,int hour,float val) 
{ 
    static int lasthour,z; 
    static float vals[25]; 
    static int nums[25]; 
    if(OUT==action) 
    { 
     if(lasthour) 
     { 
      int i; 
      for(i=1;i<=z;++i) 
       printf("%.2f; %d; ",vals[i],nums[i]); 
      printf("%d; %.2f\n",*nums,*vals); 
      lasthour=z=0;memset(vals,0,sizeof vals);memset(nums,0,sizeof nums); 
     } 
     return; 
    } 
    if(hour!=lasthour) 
     ++z,lasthour=hour; 
    vals[z]+=val; 
    nums[z]++; 
    *vals+=val; 
    *nums+=1; 
} 
main() 
{ 
    char z[100],lastday[20]=""; 
    FILE *f=fopen("test.txt","rt"); 
    while(fgets(z,sizeof z,f)) 
    { 
     char a[100],b[100]; 
     float fl; 
     if(3==sscanf(z,"%[^ ]%[^;];%f",a,b,&fl)) 
     { 
      if(strcmp(lastday,a)) 
      { 
       if(*lastday) 
        printf("%s; ",lastday),processline(OUT,0,0); 
       strcpy(lastday,a);    
      } 
      processline(ADD,atoi(b),fl); 
     } 
    } 
    if(*lastday) 
     printf("%s; ",lastday),processline(OUT,0,0); 
    fclose(f); 
    return 0; 
} 

应该工作。 需要多少个Perl-Locs?

+0

wahooo !! 它像魔术一样工作!感谢你这个真棒代码。 – chriscol 2010-08-06 10:35:29

相关问题