如何从c语言中的文件中读取特定的数据列

如何从c语言中的文件中读取特定的数据列,c,data-processing,C,Data Processing,大家好 我是c编程的初学者。我有这个问题,花了相当多的时间在上面,但没有取得任何进展 我的问题是这样说的: 我有一系列扩展名为(.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-

大家好

我是c编程的初学者。我有这个问题,花了相当多的时间在上面,但没有取得任何进展

我的问题是这样说的:

我有一系列扩展名为(.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列的统计平均值

  • 然后将结果存储在一个新文件中,该文件只包含日期和上面列的计算平均值,以供进一步分析

  • 它们将用c写

    我真的在指望你的帮助来继续这件事

    问候可以是一个起点。 首先,您必须将每一行读入一个字符串,并使用sscanf获取所需的参数,这些参数由该字符串中的空格分隔

    /* sscanf example */
    #include <stdio.h>
    
    int main ()
    {
      char sentence []="Rudolph is 12 years old";
      char str [20];
      int i;
    
      sscanf (sentence,"%s %*s %d",str,&i);
      printf ("%s -> %d\n",str,i);
    
      return 0;
    }
    
    也许有更好、更简单的方法可以做到这一点,我相信届时会有答案

    编辑:

    当然,您也可以使用or(strtok的可重入版本)解析每个字符串。
    查看链接中的示例以获得想法。

    这里是一个起点:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(int argc, char **argv)
    {
        char str[] = "2010-03-03 15:55:06; 8.01; 24.9; 14.52; 0.09; 84; 12.47;";
        char *date, *tmp;
        double mean = 0;
        int i;
    
        date = strtok(str, " ");
        strtok(NULL, " "); // skip over time
        while (tmp = strtok(NULL, ";")) {
            ++i;
            if (i == 3 || i == 6) { // get only the 3rd and 6th value
                mean += strtod(tmp, NULL);
            }
        }
        mean /= 2;
    
        printf("%s: %.2f\n", date, mean);
    
        return 0;
    }
    
    #包括
    #包括
    #包括
    int main(int argc,字符**argv)
    {
    charstr[]=“2010-03-0315:55:06;8.01;24.9;14.52;0.09;84;12.47;”;
    字符*日期,*tmp;
    双平均值=0;
    int i;
    日期=strtok(str,“”);
    strtok(NULL,“”;//随时间跳过
    while(tmp=strtok(NULL,“;”)){
    ++一,;
    如果(i==3 | | i==6){//只获取第三个和第六个值
    平均值+=strtod(tmp,零);
    }
    }
    平均值/=2;
    printf(“%s:%.2f\n”,日期,平均值);
    返回0;
    }
    

    您只需对每一行执行类似的操作。

    到目前为止您编写了哪些C代码?scanf已经可以进行这种解析了<代码>%10s%10[^;];%f;%f;%f;%f;%f;“是一个与OPs描述相匹配的格式字符串。非常感谢,这真的让我兴奋不已
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(int argc, char **argv)
    {
        char str[] = "2010-03-03 15:55:06; 8.01; 24.9; 14.52; 0.09; 84; 12.47;";
        char *date, *tmp;
        double mean = 0;
        int i;
    
        date = strtok(str, " ");
        strtok(NULL, " "); // skip over time
        while (tmp = strtok(NULL, ";")) {
            ++i;
            if (i == 3 || i == 6) { // get only the 3rd and 6th value
                mean += strtod(tmp, NULL);
            }
        }
        mean /= 2;
    
        printf("%s: %.2f\n", date, mean);
    
        return 0;
    }