1

我现在正在解析一个 csv 文件(以 .txt 格式制作),但该文件未压缩大约 350mb。压缩后,它在 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 文件(如 .zip_filename.txt)中解析它,或者甚至会有所作为?

文件太大,无法通过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");

像这样构建一个查询要快得多:

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 回答