Как прочитать данные из файла и очистить и сохранить в файл - PullRequest
0 голосов
/ 04 августа 2010

Добрый день всем.

У меня есть файл, содержащий данные, часть которых показана ниже. Он содержит записи каждые 3 секунды в течение 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. Затем распечатайте в файл следующую информацию:

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

Ответы [ 2 ]

0 голосов
/ 05 августа 2010
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 голосов
/ 04 августа 2010

Я бы подошел к этому, сделав каждую строку массивом, а затем проанализировав массив и выполнив ваши вычисления так, как вы это делаете. Похоже, что ваш файл данных имеет согласованный формат, поэтому может также воспользоваться. Хранение ячеек массива в определенных переменных и последующее приведение их к числу с плавающей точкой для вашей математики, возможно, является самым простым подходом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...