2010-08-04 5 views
0

모두 좋은 하루.파일에서 데이터를 읽고 파일을 정리하고 저장하는 방법

아래에 일부 데이터가 포함 된 파일이 있습니다. 30 초 동안 3 초마다 기록을 포함합니다. 데이터에 대해 다음을 수행하려고합니다.

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과 같은 스크립트 언어는 그러한 작업에 더 적합 해 보입니다. –

+1

왜 이런 직업에 C를 쓰겠습니까? 이러한 종류의 작업에 훨씬 더 적합한 대안 (예 : AWK, Perl)이 많이 있으며 더 간단 해집니다. 당신이 뭔가를 (당신이 질문에 언급하지 않은) 그 규칙을 필요로한다면, C++은 C# –

+0

... 또는 C# .NET의 모든 기능을 유지하면서 조금 더 단순하게 만들 것입니다. Sebastian Lorion의 Fast CSV Reader : http://www.codeproject.com/KB/database/CsvReader.aspx –

답변

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-LoC가 필요합니까?!

+0

wahooo !! 그것은 마치 마법처럼 작동합니다! 이 멋진 코드를 가져 주셔서 감사합니다. – chriscol

관련 문제