2010-08-01 26 views
0

這是跟我之前提出的問題以及在這裏的一些人的幫助下的一個後續問題,我能夠使用函數I想寫,但我還沒有完成它。 這是我早期的問題: 我有一系列帶有擴展名(.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列的平均值在一個文件中。因此,目標文件將在每行中包含三列,即日期,平均值(第三列)和平均值(第六列),由空格分隔,使其總共爲30行。以下是我開始使用的代碼,並希望您的指南介紹如何實現此目標。

就像您上面所述。 這裏是我想要實現的概要

1)打開包含文件的目錄(這裏是USB KEY)。 2)讀取裏面的所有msr文件名。 3)打開每個msr文件。 4)提取數據2(第6列的數據) 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; 
} 
+6

除非這是一個學習鍛鍊,有小於零的理由使用下了awk和Perl(尤其是)被設計來解決的任務。 – msw 2010-08-01 15:38:36

+0

您的文件如何「包含所有其他文件」 - 它是一個zip,tar,rar還是其他內容?哪些列是3和6 - 是日期列0還是列1?你如何使結果「包含在每行三行」 - 一行是一行,你的意思是列而不是行?至於msw問,爲什麼C爲這個任務?如果它的功課標記爲家庭作業,否則解釋 - 在這方面不要羞愧,但否則最好的答案是「使用更合適的,更高級別的語言」(然後你就是否是perl,awk,python,ruby,或其他; - )... – 2010-08-01 15:47:24

+2

這通常是[R](http://www.r-project.org/)的一些東西。 – Wok 2010-08-01 15:51:12

回答

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語言中,你缺少這種方便的功能,如:

  • 自動內存管理
  • 字符串容易的支持,例如拼接,分割
+0

謝謝羅蘭,我完全理解你的觀點,但重要的是,我正在使用它在已有的c項目中添加一些函數,因此它必須在c中。 實際上,有問題的文件在USB密鑰中,所以我必須打開USB密鑰目錄,獲取包含這些文件的目錄,然後按照前面所述提取內容。就這樣。 – chriscol 2010-08-02 10:17:54

相關問題