我有一个来自客户的未经规范化的事件日历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
的记录,而且没有加载的数据似乎在正确的位置。