Php 如何处理要插入mysql的大型CSV文件

Php 如何处理要插入mysql的大型CSV文件,php,mysql,csv,insert,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);

我现在正在解析一个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)中解析该文件,或者这会有什么不同

文件太大,无法通过导入方法直接插入mysql

使用内置功能:

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

insert into table (col1, col2) 
values ("row1-col1", "row1-col2"),
       ("row2-col1", "row2-col2");
顺便说一下,您还可以:


考虑使用,这将允许您直接插入CSV文件的内容。

它是
MB
(或
MiB
),但既不是
MB
也不是
MB
$contents=fread($fh,filesize($inputFile))-这绝对是您不想做的:)我以前使用过fgetcsv函数,但比fread更糟糕。它不会加载整个文件,我尝试调整内存等,但没有运气。有数百万行数据需要存储。您可能希望将它们分成批then@user1701252如果它不阅读全部内容,可能有些行超过1000个字符?通过将
0
作为
$length
传递,您可以让
fgetcsv()
确定要解析多少。批处理它们的最佳方法是什么?我现在正在尝试一些东西,我将insert语句存储到一个数组中。我会从这里做一个for循环,然后更改$x的数量吗?所以对于第一批,我可以花$x=0$x@Jack我是否需要在mysql中设置一个唯一的键,这样它就不会插入相同的行两次/3次?如果fgetcsv停止运行,那么我就不知道它停在了哪一行,以及它是否插入了新行。抱歉,但在这方面有点困惑。
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 data local infile 'file.csv' into table table_name fields terminated by ','
enclosed by '"'
lines terminated by '\n'
(col1, col2)