chr*_*ude 7 php csv error-handling loops fgetcsv
我有一个大的csv,我想解析并插入到我的数据库中.我有这个PHP:
$target = '../uploads/'.$f;
$handle = fopen($target, "r");
$data = fgetcsv($handle, 0, ",");
$rows = array();
while ($data !== FALSE) {
$rows[] = $data;
}
fclose($handle);
if (count($rows)) {
foreach ($rows as $key => $value) {
echo $value;
}
}
Run Code Online (Sandbox Code Playgroud)
每次我尝试运行我的脚本时都会收到此错误:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 35 bytes)
Run Code Online (Sandbox Code Playgroud)
任何想法如何做到这一点?
我认为这部分是错误的:
$data = fgetcsv($handle, 0, ",");
$rows = array();
while ($data !== FALSE) {
$rows[] = $data;
}
Run Code Online (Sandbox Code Playgroud)
一次调用从fgetcsv读取一行$handle。您需要放入fgetcsv循环条件:
$handle = fopen($target, "r");
$data = fgetcsv($handle, 0, ",");
while (($row = fgetcsv($handle, 0, ",")) !== FALSE) {
// Example insert - obviously use prepared statements/escaping/another DAL
$db->query("INSERT INTO tbl (columns..) VALUES ({$row[0]}, {$row[1]} ... )");
}
Run Code Online (Sandbox Code Playgroud)
在处理之前,您不需要将文件中的所有 csv 数据读入内存。
相反,创建一个 while 循环,一次从文件中读取一行。每次从文件中读取数据时,都应该在数据库中插入一行。
或者一次读取几行并插入几行。
例子:
$i = 0;
while (($data = fgetcsv($handle, 0, ",") !== FALSE) {
$rows[] = $data;
$i++;
// insert 100 rows at one time.
if ($i % 100 === 0) {
//insert these rows to db
insert_to_db($rows);
//then reset $rows
$rows = array();
}
}
insert_to_db($rows);
Run Code Online (Sandbox Code Playgroud)
虽然您当然可以使用PHP解析和构建查询,但是通过让MySQL直接处理它可以获得更好的性能.你的数据库会感谢你.
<?php
exec("mysqlimport mysqlimport [options] db_name textfile1");
?>
Run Code Online (Sandbox Code Playgroud)
资料来源: