php - 使用 PHP 脚本将 CSV 导入 MySQL
问题描述
我需要编写一个 PHP 脚本,它包含 166 列(是的,166 列)和大约 20.000 行的 CSV 文件。我对 csv 文件没有任何决定。最重要的是,它们不是常规的 csv 文件。由于某种原因,这些文件中的分隔符是“;” 而不是冒号。有些字段是完全空的,在 csv 中表示如下:value1;;value3。
我已经有了具有匹配列的数据库和表,但有一个额外的 id 列作为第一列。
我试过的:
让 LOAD DATA (LOCAL) INFILE 查询正常工作,但经过 15 个小时的不懈尝试,我决定在这里提问。我正在使用的生产服务器是 UBUNTU 服务器中的常规 LAMP 堆栈,但也安装了本地 XAMPP,它根本不起作用。
我也尝试将 csv 加载到一个数组中,然后循环遍历它,但 csv 从未正确修剪过。
即使 LOAD DATA INFILE 可以工作,我仍然会遇到数据库中的 1 列设置为 auto_increment 的问题,我真的不想在 sql 查询中指定 166 个列标题。
MySQL:
LOAD DATA INFILE 'D:/User Directories/Desktop/test.csv'
INTO TABLE nwcatalogue
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
PHP:
//I don't know ho to specify the delimiter for str_getcsv when used as
//callback
$csv = array_map('str_getcsv', file('data.csv'));
LOAD DATA INFILE 有时运行没有错误,但没有插入记录。有时我会收到权限被拒绝错误,最常见的是我会收到“重复键”或“超出范围”错误。该查询既不适用于 Windows,也不适用于 linux 文件系统。
PHP str_getcsv 函数(有点)工作得更好,但值有时不会在正确的位置分开。例如,我在数组中得到这样的值:
Array =>
[0] => 0;1;;;2;1;2;1
[1] => 0;4;;12;1;0;5
[2] => 5;1;1;;;1;2;;
[3] => 4;1;;;2;1;2;7
如果 2 个分号之间没有值,它应该只插入 NULL 作为值。
简而言之,我要么需要一个数组,其中每个值都有一个特定的键,以便我可以轻松地逐行遍历它,要么我需要让这个 LOAD DATA INFILE 查询工作。
我还拥有 Web 服务器和 mysql 服务器的管理员权限。
解决方案
尝试这个:
<?php
$query = <<<eof
LOAD DATA INFILE 'D:/User Directories/Desktop/test.csv'
INTO TABLE nwcatalogue
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(fields_go_here)
eof;
$db->query($query);
?>
至于 CSV,请尝试以下操作:
function process_csv($file) {
$file = fopen($file, "r");
$data = array();
while (!feof($file)) {
$data[] = fgetcsv($file,null,';');
}
fclose($file);
return $data;
}
然后只需调用 process_csv('D:/User Directories/Desktop/test.csv')
推荐阅读
- git - 如何使用`git svn dcommit`而不是整个提交集将特定提交推送到svn?
- android - 仅考虑Android中一天中的一天时间计算2个给定时间戳之间的时间差?
- javascript - Google Cloud Functions 结束时:使用 Axios 时超时
- c# - 如何在特定时间更改标签文本
- scala - 类文件中的常量池数据不一致
- java - 如何使用整数参数的二进制表示过滤数组?
- jenkins - 詹金斯管道:当条件和水银标签
- c# - Postgres 10 池化问题
- c++ - 可以编译 Gtk+ 应用程序以在 Gtk 2 和 3 上运行吗
- postgresql - 如何在以前使用 JPA 的项目中使用 R2DBC 实现 OneToMany、ManyToOne 和 ManyToMany?