Как читать разные файлы, хранящиеся в каталоге, и сохранять некоторые данные из них в один файл

Это продолжение вопроса, который я задавал ранее, и с помощью некоторых присутствующих здесь я смог запустить функцию, которую хочу написать, но я еще не завершил ее. Вот мой предыдущий вопрос: у меня есть ряд файлов с расширением (.msr), они содержат измеренные числовые значения более десяти параметров, которые варьируются от даты, времени, температуры, давления,.... которые разделены двоеточие. Примеры значений данных приведены ниже.

2010-03-03 15:55:06; 8.01; 24.9; 14.52; 0.09; 84; 12.47;
2010-03-03 15:55:10; 31.81; 24.9; 14.51; 0.08; 82; 12.40;
2010-03-03 15:55:14; 45.19; 24.9; 14.52; 0.08; 86; 12.32;
2010-03-03 15:55:17; 63.09; 24.9; 14.51; 0.07; 84; 12.24;

Каждый из файлов имеет имя REG_2010-03-03,REG_2010-03-04,REG_2010-03-05,... и все они содержатся в одном файле.

  1. Я хочу извлечь из каждого файла информацию о дате, которая в этом случае 2010-03-03, столбец 3 и столбец 6.
  2. Найдите среднее статистическое значение для каждого из столбцов 3 и 6. 3. Затем сохраните результаты в новом файле, который будет содержать только дату и вычисленное среднее значение из приведенных выше столбцов для дальнейшего анализа.

Мой вопрос сейчас: я хочу, чтобы иметь возможность открыть каталог, который содержит 30 файлов с расширением.msr. Я хочу открыть исходный файл, затем для каждого файла внутри него, чтобы извлечь информацию, необходимую, как я объяснил ранее, и для каждого файла, прочитанного выше, чтобы сохранить дату (одинаковую в каждом файле) и среднее значение столбцов 3 и 6 в одном файле. Таким образом, файл назначения будет содержать в каждой строке три столбца, которые представляют собой дату, среднее (3-й столбец) и среднее (6-й столбец), разделенные пробелом, что составляет в общей сложности 30 строк. Ниже приведен код, с которого я начал, и буду признателен за ваше руководство о том, как реализовать это.

так же, как вы изложили выше. Вот схема того, чего я хочу достичь

1) Откройте каталог, содержащий файлы (здесь USB KEY). 2) Прочитайте все имена MSR внутри него. 3) Откройте каждый файл MSR. 4) Извлечь дату (ее первый столбец в файле), игнорировать время и разделитель ( 5) извлечь данные 1 (данные в 3-м столбце) 6) извлечь данные 2 (данные в 6-м столбце) 7) Рассчитать среднее значение для 3-го и 6-го столбцов. 8) вывод в файл (дата, средний 3-й столбец, средний 6-й столбец) 9) закрыть MSR-файлы 10) закрыть каталог (если это возможно)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int file_getline_analyse(char *infile,char *outfile,char *path,char *strline) {

int return_value=0;

    FILE *fd=NULL;    // pointer for data source
    FILE *fo= NULL;   // Destination file
    char *file_path=NULL;     

    char *date, *tmp,*time;
    double sum, mean = 0;
    file_path=calloc((strlen(path)+strlen(infile)),sizeof(file_path));   
    if (file_path==NULL) {
        printf("file_path in get_line\n");
        exit(EXIT_FAILURE);
    }

    strcpy(file_path,path);    // copies the path entered in the function call to the allocated meomory 
    strcat(file_path,infile);  // concatenates the contents of the  allocated meomory from the source file

    fd=fopen(file_path,"r");

    fo = fopen(outfile, "w");

    if((fd==NULL) && (fo==NULL))  {
        return_value = -1;
    }
    else {
        int i=0;
        int j=0;
        while ((fgets (strline, BUFSIZ, fd))>0){
            date = strtok(strline, " ");
            time=strtok(NULL, " "); // skip over time
            tmp = strtok(NULL, ";");
            if (i == 3|| i == 6) { // get only the 3rd and 6th value
                sum += strtod(tmp, NULL);
                ++i;
                if(j== '\n') {
                    // Replacing the characters at the end of the line by 0:
                    char *p = strchr (strline, '\n');
                    if (p) {
                        *p = 0;
                    }
                    return_value = 0;
                    break;

                }
                j++;


            }

            mean = sum/(double)(j+1);

            fprintf(fo,"%s: %.2f\n", date, mean);

        }
        fclose (fd);
        fclose(fo);
    }

    free(file_path);
    file_path=NULL;

    return return_value;
}

1 ответ

Если вам не нужен язык C, я бы выбрал другой язык, например Perl:

sub analyze($) {
  my ($fname) = @_;
  my ($date, $sum3, $sum6, $n) = (undef, 0, 0, 0);

  open(F, "<", $fname) or die "$fname: $!";
  while (defined(my $line = <F>)) {
    my @words = split(m";", $line);
    $date = split(" ", $words[0])[0]; # only use the date, not the time
    $sum3 += $words[2];
    $sum6 += $words[5];
    $n++;
  }
  close(F) or die "$fname: $!";
  printf("%s;%f;%f\n", $date, $sum3 / $n, $sum6 / $n);
}

foreach my $fname (@ARGV) {
  analyze($fname);
}

В C вам не хватает таких удобных функций, как:

  • Автоматическое управление памятью
  • Простая поддержка строк, например конкатенация, разбиение
Другие вопросы по тегам