我有一个来自客户端的非规范化事件日记CSV,我试图将其加载到MySQL表中,以便我可以重构成一个正常的格式。我创建了一个名为“CSVImport”的表,它有一个字段为CSV文件的每一列。CSV包含99列,所以这本身就已经是一项艰巨的任务:

CREATE TABLE 'CSVImport' (id INT);
ALTER TABLE CSVImport ADD COLUMN Title VARCHAR(256);
ALTER TABLE CSVImport ADD COLUMN Company VARCHAR(256);
ALTER TABLE CSVImport ADD COLUMN NumTickets VARCHAR(256);
...
ALTER TABLE CSVImport Date49 ADD COLUMN Date49 VARCHAR(256);
ALTER TABLE CSVImport Date50 ADD COLUMN Date50 VARCHAR(256);

表上没有约束,所有字段都包含VARCHAR(256)值,除了包含计数(用INT表示)、是/否(用BIT表示)、价格(用DECIMAL表示)和文本介绍(用text表示)的列。

我尝试将数据加载到文件中:

LOAD DATA INFILE '/home/paul/clientdata.csv' INTO TABLE CSVImport;
Query OK, 2023 rows affected, 65535 warnings (0.08 sec)
Records: 2023  Deleted: 0  Skipped: 0  Warnings: 198256
SELECT * FROM CSVImport;
| NULL             | NULL        | NULL           | NULL | NULL               | 
...

整个表被NULL填充。

我认为问题在于文本简介包含多行,MySQL解析文件时就好像每个新行对应一个数据库行一样。我可以毫无问题地将文件加载到OpenOffice中。

csv文件包含2593行和570条记录。第一行包含列名。我认为它是用逗号分隔的,文本显然是用双引号分隔的。

更新:

如果有疑问,请阅读手册:http://dev.mysql.com/doc/refman/5.0/en/load-data.html

我在LOAD DATA语句中添加了一些OpenOffice智能推断的信息,现在它加载了正确数量的记录:

LOAD DATA INFILE "/home/paul/clientdata.csv"
INTO TABLE CSVImport
COLUMNS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

但是仍然有很多完全为空的记录,没有一个数据被加载似乎在正确的地方。


当前回答

phpMyAdmin可以处理CSV导入。以下是步骤:

准备CSV文件,使字段与MySQL表字段的顺序相同。 从CSV中删除标题行(如果有的话),以便文件中只有数据。 进入phpMyAdmin界面。 在左侧菜单中选择表。 单击顶部的导入按钮。 浏览到CSV文件。 选择选项“CSV using LOAD DATA”。 在“以”结尾的字段中输入“,”。 按与数据库表中相同的顺序输入列名。 点击go按钮,你就完成了。

这是我为将来使用准备的笔记,如果其他人能从中受益,就分享在这里。

其他回答

试试这个,对我很管用

    LOAD DATA LOCAL INFILE 'filename.csv' INTO TABLE table_name FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 ROWS;

IGNORE 1 ROWS这里忽略包含字段名的第一行。注意,对于文件名,必须键入文件的绝对路径。

另一个解决方案是使用csvkit套件中的csvsql工具。

使用的例子:

csvsql --db mysql://$user:$password@localhost/$database --insert --tables $tablename  $file

该工具可以自动推断数据类型(默认行为),创建表并将数据插入到创建的表中。——override选项可以用来删除已经存在的表。——insert选项——从文件中填充表。

安装套件

pip install csvkit

前提条件:python-dev, libmysqlclient-dev, MySQL-python

apt-get install python-dev libmysqlclient-dev
pip install MySQL-python

使用mysqlimport加载一个表到数据库:

mysqlimport --ignore-lines=1 \
            --fields-terminated-by=, \
            --local -u root \
            -p Database \
             TableName.csv

我在http://chriseiffel.com/everything-linux/how-to-import-a-large-csv-file-to-mysql/找到的

要使分隔符为制表符,请使用——fields-terminated-by='\t'

当执行MySQL查询导入CSV时,我得到了错误 错误代码:1290。MySQL服务器使用——secure-file-priv选项运行,因此无法执行此语句。

所以我把文件移到安全文件位置

LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Orders.csv'   
INTO TABLE orderdetails.orders 
FIELDS TERMINATED BY ','  
 ENCLOSED BY '"'
 LINES TERMINATED BY '\n'
 IGNORE 1 ROWS

文件的位置是“C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Orders.csv”,这是因为,我将我的CSV文件移动到“secure_file_priv”位置,否则我就会得到上面的错误

你可以通过查询SHOW VARIABLES LIKE "secure_file_priv"来获得你的secure_file_priv;

来源:导入CSV文件到MySQL(查询或使用Workbench)

如果你使用Intellij https://www.jetbrains.com/datagrip/features/importexport.html