2016-04-20 20 views
0

5.5Mを超えるテキストファイルを読みたいのですが、テスト提案のために900行と70列のファイルを読み込んでmatrix x[1000][100]に保存しました。Cで巨大なTxtを読む

私はこの日の番号を含むテキストファイルの13番目の列を認識したいので、これをやります。さらに、このテキストを、毎日のデータを含む他の多くのテキストファイルに分割します。

同じ値を持つ別のテキストファイルを作成し、13番目の列が変わるたびに、"NEW DAY"というメッセージを書きます。その後、他のソフトウェアを使用してこの"NEW DAY"を追跡し、見つかったら分割します。

すべてがファイルが各行の13th columnに変更を認識するために停止した理由をただし、この値の後に、私が知らないだけ"NEW DAY"ときに書き込みを停止、各行約70 columnsを持っていることを覚えて、line 385までうまく機能しています番号が変わります。

データがこのように示されています:

Tの背後にある数は、私が追跡したいものです
TAM 2000-03-07T16:55 22.78 5.50999 2 110 1 233 2.2 65 0.3 293 0 

。ここで

はコードです:

int main() 
{ 
    long int i = 0; 
    long int j = 0; 
    char x[1000][100]; 
    FILE *file = fopen("Entrada.txt", "r"); 
    FILE *file2 = fopen("Saida.txt", "w"); 

    while ((x[i][j] = fgetc(file)) != EOF) { 
     if(i>=1 && j==70) { 
      if(x[i][13] != x[i-1][13]) { 
       for(j=0; j <= 70;j++) { 
        fprintf(file2, "%c", x[i-1][j]); 
        printf("%c", x[i-1][j]); 
        if(j==70){ 
         fprintf(file2, "\n %s \n","New Line"); 
         printf("\n %s \n","New Line"); 
        } 
       } 
      } else { 
       for(j=0; j <= 70 ;j++) { 
        fprintf(file2, "%c", x[i][j]); 
        printf("%c", x[i][j]); 
        if(j==70) { 
         fprintf(file2, "\n %s \n",""); 
         printf("\n %s \n",""); 
        } 
       } 
      } 
     } 

     if(x[i][j] =='\n'){ 
      i++; 
      j=0; 
     } else { 
      j++; 
     } 
    } 

    fclose(file2); 
    return 0; 
} 
+2

すべての行を配列に格納する理由はありますか?ファイルを行単位で処理するだけではないのですか? –

+0

私はどのように行ごとに格納することができますか分かりません。私にとっては、前にある行と前の行を比較してから別のテキストファイルに書き込むだけです。 ダイナミックメモリの割り当てについて、これは申し訳ありませんが、どこで使用するべきかわかりません。私は、より大きなマトリックスを作るためにそれを使うべきですか?私は行列全体を読むことができるので、いつかしばらくして列の検証を止めるという問題があります。 –

+0

私の最初のコメントを忘れました(削除したばかりです)。あなたのプログラムはひどく複雑ですが、 'fgets'を使って行ごとにファイルを読んで、それらを読むときに行を処理します。すべてを配列に格納する必要はありません。 –

答えて

3

あなたの状態あなたの質問ではあなたが一日が変更かどうかを確認するために13番目の文字をチェックする必要があり、あなたが一日で一桁をチェックしそうです。日数は2桁です。 Cの配列インデックスで

は0ので、インデックス 12と13だけで、あなたはすべての行を格納して比較する必要はありません。つまり、カラム13および14

をチェックする必要があるように見えるあなたのサンプル入力に基づいて基づいています変化する情報、すなわち1日を示す2つの文字を保存します。

あなたが代わりにこのような何かを試みることができる:

char line[100]; 
char old12 = ' '; 
char old13 = ' '; 
long row = 0; 
while (fgets(line, sizeof(line), file1) != NULL) 
{ 
    if (row++>0) 
    { 
    if (line[12] != old12 || line[13] != old13) 
    { 
     /* remove \n */ 
     char* nl = strchr(line,'\n'); 
     if (nl) *nl = '\0'; 
     fprintf(file2,"%s", line); 
     fprintf(file2, " New Line\n"); 
    } 
    else 
    { 
     fprintf(file2,line); 
    } 
    } 
    else 
    { 
    fprintf(file2,line); 
    } 
    old12 = line[12]; 
    old13 = line[13]; 
} 

あなたは大きなファイルを処理する場合、大きな2次元配列はあなたの問題を引き起こすことがバインドされていたが、代わりにテキストのように少しを維持しよう可能な限りメモリ。 、

TAM 2000-03-07T16:55 22.78 5.50999 2 110 1 233 2.2 65 0.3 293 0 
TAM 2000-04-07T16:55 22.78 5.50999 2 110 1 233 2.2 65 0.3 293 0 
+0

あなたの助けてくれてありがとう、あなたは私にもアイデアをくれました。私はちょうどあなたが2桁を持っていても、その日が変わったときでも、最後の数字はいつも最後の日とは異なるため、最後の数字をチェックしました。 09であっても10になっても、最後の桁は9から0に変わります。データについては、サンプルとして使用されているような線が多く、30,000のファイルで、44640行と67の列が固定されています。 –

0

人物:

あなたのデータを記述しませんでしたが、データにギャップがある場合は、そうでない場合は、このような行が検出されないだけではなく、一日の全体の日付を確認することもできます私は私の問題の解決策を見つけ出し、1700万以上の行を持つ膨大なファイルを扱っていました。ここで

は、ここでは、私はC.

と専門家ではないですので、それは

ヘルプありがとうございました、おそらく、私は多くはない必要なものを作ってきた非常に大きいと、コードはコード

です
#include <stdio.h> 
#include <stdlib.h> 

int TAM_BUFFER = 75; 
int TAM_BUFFER2 = 75; 
int count = 0; 

int main(int argc, char *argv[]) 
{ 
FILE *arquivo = fopen("ConcatenatedFiles.txt", "r"); 
FILE *saida = fopen("Saida.txt", "w"); 

char buffer[TAM_BUFFER]; 
char buffer2[TAM_BUFFER2]; 

if(arquivo != NULL){ 

while(fgets(buffer, TAM_BUFFER, arquivo)){ 

     if(count==0){ 
      printf("%s\n", buffer); 
     } 

     count++; 


     if(count>1){ 
      if(buffer2[13]!=buffer[13]){ 
       printf("%s\n", buffer2); 
       printf("%s\n", "NEW DAY"); 
       printf("%s\n", buffer); 

       fprintf(saida,"%s\n", buffer2); 
       fprintf(saida,"%s\n", "NEW DAY"); 
      } 
      else{ 
       if(buffer2[12]!=buffer[12]){ 
       printf("%s\n", buffer2); 
       printf("%s\n", "NEW DAY"); 
       printf("%s\n", buffer); 

       fprintf(saida,"%s\n", buffer2); 
       fprintf(saida,"%s\n", "NEW DAY"); 
       } 
       else{ 
        printf("%s\n", buffer2); 
        printf("%s\n", buffer); 

        fprintf(saida,"%s\n", buffer2); 
        fprintf(saida,"%s\n", buffer); 
       } 
      } 
     } 

     if(count>=1){ 
     fgets(buffer2, TAM_BUFFER2, arquivo) ; 

     } 

     if(count=1){ 
      if(buffer[13]!=buffer2[13]){ 
       printf("%s\n", "NEW DAY"); 

       fprintf(saida,"%s\n", buffer); 
       fprintf(saida,"%s\n", "NEW DAY"); 
      } 
      else{ 
       if(buffer[12]!=buffer2[12]){ 
       printf("%s\n", "NEW DAY"); 

       fprintf(saida,"%s\n", buffer); 
       fprintf(saida,"%s\n", "NEW DAY"); 
       } 
      } 
      } 
} 
printf("%s\n", buffer2); 

fclose(arquivo); 
} 
else 
printf("Not possible to open the file."); 

printf("\n\n"); 
system("PAUSE"); 
return 0; 
} 
関連する問題