2011-02-10 156 views
1

如何将大型csv文件中的某些行导入到MySQL表中。 我知道如何导入所有的数据,但我的问题是我的CSV文件太大,我不需要它拥有的所有数据。从CSV到MySQL的选择性导入

我只想导入“COLUMN_X”具有这些值中的任何一个的行[VALID1,VALID2,VALID3] 对于column_x具有无效值的所有其他行都应该被忽略。

任何人都可以帮助我做到这一点? 非常感谢。

回答

1

您可以使用类似:

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

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

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;

3

不能用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) 
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 
  • IGNORE如果重复键在CSV中忽略行。
  • (field1, field2, @pk, field3, @columnx)是CSV列到值的映射。具体做法是:在CVS的第一场进入field1列中,CVS的第二场进入field2列中,CSV的字段thirs进入可变@pk
  • pk =设置命名pk到任何结果列=之后的表达式是。在这种情况下,如果在CSV的第五列中遇到其中一个有效值,它会将列pk设置为NULL。否则,它设置该列'key'

这个工作,如果pk是持有主键列,该表已经与'key'作为主键与主键设置为auto_increment列的记录。