从CSV到MySQL的选择性导入

时间:2011-02-10 22:14:49

标签: mysql csv import

如何将大型csv文件中的某些行导入MySQL表。 我知道如何导入所有数据但我的问题是我的csv文件太大而且我不需要它拥有的所有数据。

我只想导入“COLUMN_X”具有这些值之一的行[VALID1,VALID2,VALID3] 应忽略具有column_x无效值的所有其他行。

任何人都可以帮我这么做吗? 非常感谢。

4 个答案:

答案 0 :(得分:3)

您无法使用LOAD DATA INFILE过滤掉行,因此要么通过预处理CSV文件来过滤掉这些行,要么将数据加载到临时表中并将相关行插入主表中,例如:< / p>

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)

答案 1 :(得分:1)

您可以使用以下内容:

LOAD DATA INFILE 'myfile.csv'
INTO mytable
 (column1, @dummy, @dummy, column2, column3)

只会将第1,第4和第5列加载到数据库中。但是你需要知道你的“好”栏目提前到哪个位置。

答案 2 :(得分:1)

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
    如果在CSV中找到重复的密钥,则
  • IGNORE会忽略行。
  • (field1, field2, @pk, field3, @columnx)是CSV列到值的映射。具体来说:CVS的第一个字段进入列field1,CVS的第二个字段进入列field2,CSV的第二个字段进入变量@pk,等等。 / LI>
  • pk =将名为pk的列设置为=后面的表达式的结果。在这种情况下,如果在CSV的第五列中遇到其中一个有效值,它会将列pk设置为NULL。否则,它会将该列设置为'key'

如果pk是包含主键的列,表已经有'key'作为主键,而主键设置为auto_increment的列,则此方法有效

答案 3 :(得分:0)

来自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;