【发布时间】:2011-04-07 19:15:54
【问题描述】:
我有一个来自客户端的非规范化事件日志 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。
clientdata.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;
但是仍然有很多完整的NULL 记录,并且加载的数据似乎都没有放在正确的位置。
【问题讨论】:
-
如果你在 OSX 上,Sequel Pro 有一个很棒的导入工具,而且它是 免费 ;-)
-
令我惊讶的是,原发帖人比任何人都更好地回答了他自己的问题……我不知道为什么有这么多人愿意在现有 SQL 命令的情况下提供软件推荐,它可以是programmatic而不是基于UI的。我不了解其他人,但程序化对我来说意味着我可以设置脚本以在时间戳上自动导入文件,而基于 UI 的纯粹是手动的。
-
@ChrisCirefice:我认为接受的答案很好地解释了这一点。他需要一些帮助,手动创建“加载数据”命令,图形程序可以提供帮助。一旦图形程序创建了“加载数据”命令,他就可以以编程方式重用它。
-
@Merrick 这对 osx 很有效
-
@ChrisCirefice 脚本非常适合重复事件;但是 GUI 更适合一次性的事情,因为您不必为了一次做一件事而弄清楚所有的秘密
标签: mysql csv load-data-infile