0

これは私が以前に尋ねた質問のフォローアップであり、ここにいる何人かの人々の助けを借りて、私が書きたい関数を開始することができましたが、まだ完成していません. ここに私の以前の質問があります: 拡張子 (.msr) を持つ一連のファイルがあります。これらのファイルには、日付、時刻、温度、圧力などの範囲の 10 個を超えるパラメーターの測定数値が含まれており、セミ区切りになっています。結腸。データ値の例を以下に示します。

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 つのファイルに含まれています。

  1. 各ファイルから日付情報を抽出したいのですが、この場合は 2010 年 3 月 3 日、列 3、列 6 です。
  2. 3 列と 6 列のそれぞれの統計的平均を見つけます。 3.次に、日付のみを含む新しいファイルに結果を保存し、さらに分析するために上記の列の計算された平均を保存します。

今の私の質問: 拡張子が .msr の 30 個のファイルを含むディレクトリを開くことができるようにしたいです。ソースファイルを開き、その中の各ファイルについて、前に説明したように必要な情報を抽出し、上記で読み取った各ファイルについて、日付 ​​(各ファイルで均一) と列 3 と 6 の平均値を保存します。したがって、宛先ファイルには、日付、平均 (3 列目) および平均 (6 列目) の 3 つの列が各行に含まれ、スペースで区切られ、合計 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 に答える