首页 > 解决方案 > 使用 LOAD DATA 导入 CSV 得到错误值

问题描述

我有一个很大的 csv(接近 100mb),我想将它导入到具有以下结构的表中:

+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| id          | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| cep         | varchar(255)     | YES  | MUL | NULL    |                |
| site        | text             | YES  |     | NULL    |                |
| cidade      | text             | YES  |     | NULL    |                |
| uf          | text             | YES  |     | NULL    |                |
| cepbase     | text             | YES  |     | NULL    |                |
| segmentacao | text             | YES  |     | NULL    |                |
| area        | text             | YES  |     | NULL    |                |
| cepstatus   | int(1)           | YES  |     | NULL    |                |
| score       | int(11)          | NO   |     | NULL    |                |
| fila        | int(11)          | NO   |     | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+

我正要编写一些要导入的代码,但我发现了一个 MySQL 命令可以为我完成这项工作。所以我写了以下内容:

LOAD DATA LOCAL INFILE '/Users/user/Downloads/base.csv'
INTO TABLE cep_status_new
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
IGNORE 1 ROWS
(@id,@cep,@site,@cidade,@uf,@cepbase,@segmentacao,@area,@cepstatus,@score,@fila)
SET id=NULL, cep=@col1, site='GOD', cidade=@col6, uf=@col7, cepbase='-', segmentacao=@col9, cepstatus=@col2, area='BING', score=99999, fila=5;

为了尝试这段代码,我从 CSV 中删除了 1000 行,只保留了 2 行:标题和输入示例:

cep,status,gang,bang,random,mock,awesome,qwert,hero
01019000,0,00387,00388,3550308,SAO PAULO,SP,011,B2

代码运行没有问题,但我的插入很奇怪:

mysql> select * from cep_status_new;
+----+------+------+--------+---------+---------+-------------+------+-----------+-------+------+
| id | cep  | site | cidade | uf      | cepbase | segmentacao | area | cepstatus | score | fila |
+----+------+------+--------+---------+---------+-------------+------+-----------+-------+------+
|  1 | 1    | GOD  | 24655  | 3554805 | -       | SP          | BING |         0 | 99999 |    5 |
+----+------+------+--------+---------+---------+-------------+------+-----------+-------+------+
1 row in set (0.01 sec)

为什么 CSV 中的值未正确填写?

标签: mysql

解决方案


根据此规范,列列表IGNORE 1 ROWS决定 CSV 文件的列如何映射到表的列。它可以按文件顺序列出表格列,也可以将文件列加载到变量中。与列列表

(@id,@cep,@site,@cidade,@uf,@cepbase,@segmentacao,@area,@cepstatus,@score,@fila)

您正在将 CSV 文件的 11 列加载到名为“id”、“cep”等SET的变量中。然后,您需要在语句中声明如何从变量构造表的列。使用给定的语句,您指的是未在任何地方定义的变量@col1等,因此具有未定义的值。

更正的陈述(遗憾的是我现在无法测试自己)应该是:

INTO TABLE cep_status_new
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
IGNORE 1 ROWS
(@col1,@col2,@col3,@col4,@col5,@col6,@col7,@col8,@col9)
SET id=NULL, cep=@col1, site='GOD', cidade=@col6, uf=@col7, cepbase='-', segmentacao=@col9, cepstatus=@col2, area='BING', score=99999, fila=5;

推荐阅读