1

現在解析中のcsvファイル(.txtとして作成)のファイルがありますが、ファイルは約350MBの非圧縮ファイルです。zipすると、zipファイルに23MBと表示されます。350mbファイルを解析しようとすると、システムが完全にフリーズします。このような配列に行を格納します。最初の行は見出しです。

$fh = fopen($inputFile, 'r');
    $contents = fread($fh, filesize($inputFile)); // 5KB
fclose($fh);
//$contents = str_replace('"','',$contents);

$fileLines = explode("\n", $contents); // explode to make sure we are only using the first line.

次に、各行を調べて、ループ内でmySQLに挿入します。ファイルは約350MBなので、.zip_filename.txtのような.zipファイルから解析する方法はありますか?それともまったく違いがありますか?

ファイルが大きすぎるため、importメソッドを介してmysqlに直接挿入できません。

4

2 に答える 2

2

組み込み関数fgetcsvを使用します。

<?php
$row = 1;
if (($handle = fopen($inputFile, "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data);
        echo "<p> $num fields in line $row: <br /></p>\n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";
        }
    }
    fclose($handle);
}
?>

可能であれば、マルチインサートも使用してください。複数のクエリを実行する代わりに:

insert into table (col1, col2) values("row1-col1", "row1-col2");
insert into table (col1, col2) values("row2-col1", "row2-col2");

次のような 1 つのクエリを作成する方がはるかに高速です。

insert into table (col1, col2) 
values ("row1-col1", "row1-col2"),
       ("row2-col1", "row2-col2");

ちなみに、ファイルを直接 mysql にロードすることもできます:

load data local infile 'file.csv' into table table_name fields terminated by ','
enclosed by '"'
lines terminated by '\n'
(col1, col2)
于 2012-11-25T18:12:23.980 に答える
0

を使用することを検討してくださいLOAD DATA INFILE。これにより、CSV ファイルの内容を直接挿入できます。

于 2012-11-25T19:06:23.247 に答える