Как читать разные файлы, хранящиеся в каталоге, и сохранять некоторые данные из них в один файл
Это продолжение вопроса, который я задавал ранее, и с помощью некоторых присутствующих здесь я смог запустить функцию, которую хочу написать, но я еще не завершил ее. Вот мой предыдущий вопрос: у меня есть ряд файлов с расширением (.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,... и все они содержатся в одном файле.
- Я хочу извлечь из каждого файла информацию о дате, которая в этом случае 2010-03-03, столбец 3 и столбец 6.
- Найдите среднее статистическое значение для каждого из столбцов 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 вам не хватает таких удобных функций, как:
- Автоматическое управление памятью
- Простая поддержка строк, например конкатенация, разбиение