【问题标题】:How to read different files stored in a directory and store some data from them to one file如何读取存储在目录中的不同文件并将其中的一些数据存储到一个文件中
【发布时间】: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...,它们都包含在一个文件中。

  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;
}

【问题讨论】:

  • 除非这是一个学习练习,否则将 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


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

  • 自动内存管理
  • 轻松支持字符串,例如连接、拆分

【讨论】:

  • 谢谢你,Roland,我非常理解你的观点,但关键是,我正在使用它在已经存在的 c 项目中添加一些功能,因此它必须在 c 中。实际上,有问题的文件在 USB 密钥中,所以我必须打开 USB 密钥目录,获取包含文件的目录,然后如前所述提取内容。就是这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 2016-08-19
  • 2015-12-23
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多