0

这是我之前提出的问题的后续,在这里的一些人的帮助下,我能够开始使用我想要编写的功能,但我还没有完成它。这是我之前的问题:我有一系列扩展名为 (.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;
}
4

1 回答 1

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 语言中,您缺少一些方便的功能,例如:

  • 自动内存管理
  • 轻松支持字符串,例如连接、拆分
于 2010-08-01T18:25:08.790 回答