mysql - 使用 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 中的值未正确填写?
解决方案
根据此规范,列列表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;
推荐阅读
- mysql - 根据 mySQL 中年份的第一天将年份、星期转换为日期
- neural-network - 如何从 keras NN 获取可能性数据?
- python - 将 Python gui 窗口放在前面?
- vb.net - 如何在 VB.net 中显示 .txt 文件的内容并进行比较
- php - 尝试呈现内容时出现白页
- haskell - 使用 postgresql-simple 查询字符串的类型错误
- asp.net-mvc - Azure Active Directory 身份验证问题
- angular - 位置 437 的 JSON 中的意外标记 }
- python - 比较列表python列表的元素
- sql - 查找重叠的日期范围并从事实表中删除重复项