php - 如何处理大型 CSV 文件以插入到 mysql 中

标签 php mysql csv insert

我现在正在解析一个 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中。

最佳答案

使用内置函数 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");

对了,你也可以load a file directly into mysql :

load data local infile 'file.csv' into table table_name fields terminated by ','
enclosed by '"'
lines terminated by '\n'
(col1, col2)

关于php - 如何处理大型 CSV 文件以插入到 mysql 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13553875/

相关文章:

使用多维数组的 PHP 内容旋转器

php - Zend_Db : How to connect to a MySQL database over SSH tunnel?

c - 如何正确地将 CSV 从文本文件加载到 C 中的结构?

PHP:正则表达式忽略引号内的转义引号

php - 制作等同于 PHP 正则表达式的 JavaScript 正则表达式

javascript - 未解析时为 undefined json,解析时为 undefined token

linux - 使用 awk 将 csv 拆分为多个带标题的文件

php - 两个表的逻辑问题

php - 获取查询中数据库存储号码的前 5 位数字

python - Pandas 分组/透视数据,而一列的条目成为新标签