我必须处理一个相当大的文件,大约需要处理40,000个++逗号分隔的行。直接使用Load数据infile可能不实用,因为文件需要预处理,修剪和清理。所以我使用PHP的文件处理函数并将整个文件读入一个数组,然后对其进行预处理以创建一个新的数组,形成可接受的行。
尝试使用批量插入将这个巨大的数组添加到数据库中不起作用,浏览器崩溃时出现“无数据接收错误”响应。我试图将批量插入数量减少到每个批量插入1000个,并产生相同的错误。其余的脚本运行正常,并且Bulk insert方法已经过测试,所以没有任何问题。
为了解决这个问题,我决定将输出这个数组用于存储在我的htdocs中的一个文件夹中的新CSV文件,如下所示:
$fp = "reports/$filename" ; // fopen($_FILES['csvfile']['tmp_name'], "w");
$headline = array("contactid","firstname","lastname","email","companyid","companyname");
fputcsv($fp, $headline);
foreach ($newUsers as $fields) {
fputcsv($fp, $fields);
}
fclose($fp);
上面的命令完美地写下文件,我可以在我的服务器上访问它。但是,Load data infile命令无法访问此文件。
这是我的加载数据infile命令:
LOAD DATA LOCAL INFILE '$file'
INTO TABLE $table
CHARACTER SET latin1
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
SQLQUERY;
$ file是我刚刚写的CSV文件的名称。
我也尝试删除'LOCAL'一词,在这种情况下,它假定文件路径是存储mysql的子目录,并给出了这个错误:
找不到文件'/var/www/mysql/reports/thecsvfile.csv'
这是真实的。
我能解决这个问题吗?