【发布时间】:2011-02-10 22:14:48
【问题描述】:
如何将大型 csv 文件中的某些行导入 MySQL 表。 我知道如何导入所有数据,但我的问题是我的 csv 文件太大,我不需要它拥有的所有数据。
我只想导入“COLUMN_X”具有以下任一值的行 [VALID1, VALID2, VALID3] 应忽略 column_x 具有无效值的所有其他行。
谁能帮我做这件事? 非常感谢。
【问题讨论】:
如何将大型 csv 文件中的某些行导入 MySQL 表。 我知道如何导入所有数据,但我的问题是我的 csv 文件太大,我不需要它拥有的所有数据。
我只想导入“COLUMN_X”具有以下任一值的行 [VALID1, VALID2, VALID3] 应忽略 column_x 具有无效值的所有其他行。
谁能帮我做这件事? 非常感谢。
【问题讨论】:
您无法使用 LOAD DATA INFILE 过滤掉行,因此要么通过预处理 CSV 文件过滤掉这些行,要么将数据加载到临时表中并将相关行插入主表中,例如;
CREATE TEMP TABLE import LIKE my_main_table;
LOAD DATA LOCAL INFILE 'myfile.csv' into import;
INSERT INTO my_main_table SELECT * FROM import
WHERE column_x IN(VALID1, VALID2, VALID3)
【讨论】:
你可以使用类似的东西:
LOAD DATA INFILE 'myfile.csv'
INTO mytable
(column1, @dummy, @dummy, column2, column3)
这只会将第 1、4 和 5 列加载到数据库中。但是你需要提前知道你的“好”列在哪个位置。
【讨论】:
来自comments to mysql documentation的解决方案:
CREATE TABLE your_table ( .....)
PARTITION BY LIST (COLUMN_X)
(
PARTITION main VALUE IN (VALID1, VALID2, VALID3)
);
LOAD DATA INFILE 'your_file.csv' IGNORE INTO your_table .....
如果需要将数据追加到现有表中,可以按照上述方法新建一个临时表并将数据导入其中,然后INSERT INTO old_table SELECT * FROM your_table;
【讨论】:
LOAD DATA INFILE 'filename' IGNORE
INTO TABLE `table` (field1, field2, @pk, field3, @columnx)
SET pk = IF (@columnx IN ('VALID1', 'VALID2', 'VALID3'), NULL, 'key'),
COLUMN_X = @columnx
IGNORE 将忽略行。(field1, field2, @pk, field3, @columnx) 是 CSV 列到值的映射。具体来说:CVS的第一个字段进入field1列,CVS的第二个字段进入field2列,CSV的第三个字段进入变量@pk等。pk = 将名为 pk 的列设置为 = 后面的表达式的结果。在这种情况下,如果在 CSV 的第五列中遇到有效值之一,它会将列 pk 设置为 NULL。否则,它将该列设置为'key'
如果pk 是保存主键的列,表已经有一条以'key' 作为主键的记录并且主键列设置为auto_increment,则此方法有效。
【讨论】: