0

次のようなテキストファイルがたくさんあります。

987654 Example 1
321987 Test 2
654321 Whatever 1

各列は特定の値 (ID、タイムスタンプ、名前など) を表します。これらすべてを MySQL テーブルに注ぎ込もうとしています。これらのファイルの各行を個別に読み取り、各行のどの部分が行のどの列に入る必要があるかを解析する必要があります。

各ファイルには約 5,000,000 行が含まれます。私はこれだけでテストをしてみました:

$test = array();
for($i=1;$i<5000000;$i++){
  $test[] = '';
}

その多くの要素を持つ空の配列でさえ、私のメモリ制限を超えてしまいます (64mb、私のホストはそれ以上のものを許可しないので、それも維持する必要があります)。そのため、ファイルを配列に変換することは不可能であり、おそらく少しばかげています振り返って考える。以前にこのようなことをする必要がなかったので、私はここで私の要素から外れています.

foreach配列を使用せずにファイル内の行のようなことを行うにはどうすればよいですか?

4

3 に答える 3

0

MySQL 組み込みLOAD DATA INFILEステートメントが自分に合わないかどうかを確認してください。

そうでない場合は、PHPSplFileObjectクラスを使用して、すべてのファイルをメモリにロードせずにファイル行を反復処理できます。やなどの行を解析する特定のメソッドがSplFileObject::fgetcsv()ありSplFileObject::fscanf()ます。この場合PDO、MySQL トランザクションを使用してすべての挿入ステートメントを一度にコミットし、インポート プロセスを高速化するか、何か問題が発生した場合にすべてのステートメントをロールバックすることができます。

于 2013-11-11T04:58:30.630 に答える