如何读取存储在目录中的不同文件,并将一些数据存储到一个文件中

时间:2010-08-01 15:34:23

标签: c data-processing

这是我之前提出的问题的后续问题,在这里的一些人的帮助下,我能够启动我想写的功能,但我还没有完成它。 这是我之前的问题: 我有一系列扩展名为(.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.然后将结果存储在一个新文件中,该文件仅包含日期和上面列的计算平均值,以供进一步分析。
  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 个答案:

答案 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中,你缺少像:

这样的便利功能
  • 自动内存管理
  • 轻松支持字符串,例如连接,拆分