这是我之前提出的问题的后续问题,在这里的一些人的帮助下,我能够启动我想写的功能,但我还没有完成它。 这是我之前的问题: 我有一系列扩展名为(.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,......它们都包含在一个文件中。
我现在的问题: 我希望能够打开包含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;
}
答案 0 :(得分:0)
如果你不需要它在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中,你缺少像:
这样的便利功能