【发布时间】:2010-08-01 15:34:23
【问题描述】:
这是对我之前提出的问题的跟进,在这里的一些人的帮助下,我能够开始使用我想要编写的功能,但我还没有完成它。 这是我之前的问题: 我有一系列扩展名为 (.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;
}
【问题讨论】:
-
除非这是一个学习练习,否则将 C 用于 awk 和 perl(尤其是)旨在解决的任务的理由少于零。
-
您的文件如何“包含所有其他文件”——它是 zip、tar、rar 还是其他文件?哪些列是 3 和 6 - 日期列 0 还是列 1?你如何使结果“每行包含三行”——一行是一行,你的意思是列而不是行?正如 msw 所问,为什么 C 来完成这项任务?如果是家庭作业,则将其标记为家庭作业,否则请解释——这并不丢人,但最好的答案是“使用更合适、更高级的语言”(然后你会争论这是否是 perl、awk、python、ruby、或其他什么;-)...
-
这通常适用于R。
-
感谢大家的努力。至于为什么要使用c,我是用它在一个已经存在的c项目中添加一些功能,所以它必须在c中。 @ Alex,只是有点混乱,我的意思是每一行将包含三列数据(对于每个文件)。实际上,有问题的文件在 USB 密钥中,所以我必须打开 USB 密钥目录,获取包含文件的目录,然后如前所述提取内容。就是这样。
标签: c data-processing