0

400Mb を超えるファイルがあります

このようにしか配信されない時刻表データベースです。

このテキスト ファイルには、データ レコードの開始を示す文字列があります。

この文字列は常に「BSN」で始まり、同様に常に「LT」で始まるデータ レコードの終わりを示す文字列があります。

私が理解しようとしているのは、データ ファイルを 1000 個のデータ レコードを含むチャンクに切り刻む方法です。このサイクルが完了すると、それらのファイルを順番にインポートできます。

作成されたファイルには、新しいフォルダーで順番に番号を付ける必要があります...

[編集] レコード セットの長さは大きく異なります [/編集]

以下は、グループの 1 つのサンプルです。

BSNC031551112111206240000001   << DATA RECORD START >> 
BX         EMYEM129000                                                           
LOSHEFFLD 2235 2235                                                
LIDORESNJ                                              
LISPDN                                       
LTDRBY    2326 23266           << DATA RECORD END >>                                        
BSNC033501112111205130000001   << NEXT RECORD >>
BX         EMYEM118600    

※ << >> タグはファイル内には存在しないので、念のため追加してあります。

私は現在、PHP fopen / fgets メソッドhereを使用してファイルを読み込んでいます

4

2 に答える 2

1

このようなものはあなたのために働くはずです

$fp = fopen($bigfile, "r");

$file_num = 1;
$prefix = "FILE_";
$suffix = ".DAT";
$buff = "";
$recNo = 0;
while ($rec = fgets($fp)){
    if (substr($rec, 0,3) == 'BSN'){
        $recNo++;
    }

    if ($recNo == 1000){
        // reset record counter
        $recNo = 1;
        // flush out the file
        file_put_contents($prefix.$file_num.$suffix, $buff);
        // clear the buffer
        $buff = "";
        // increment the file counter
        $file_num++;
    }
    // add to the buffer
    $buff.= $rec;
}
fclose($fp);

// flush the remainder
if ($buff) file_put_contents($prefix.$file_num.$suffix, $buff);
于 2013-05-21T16:51:30.110 に答える
-2

定義済みのデータ構造がある場合は、分割コマンド (unix) を使用できます。

 split -l 6000 your_big_file.txt data_

このコマンドは、大きなファイルを小さな 6000 文字列 (1000 データ レコード) に分割します。

または、データ構造が均一でない場合は、perl ワンライナーを使用できます。

perl -n -e '/^BSNC/ and open FH, ">output_".$n++; print FH;' your_big_file

Perl は、ファイル全体をメモリに丸呑みする代わりに、行ごとに大きなファイルを解析できます。

データレコードごとに新しいファイルが作成されます。Ext4 ファイル システムの理論上の制限は、ディレクトリあたり 40 億ファイルです。

この後、PHP スクリプトを使用してすべてのデータをデータベースにインポートできます。

于 2013-05-21T16:27:32.523 に答える