如何将大型csv文件中的某些行导入MySQL表。 我知道如何导入所有数据但我的问题是我的csv文件太大而且我不需要它拥有的所有数据。
我只想导入“COLUMN_X”具有这些值之一的行[VALID1,VALID2,VALID3] 应忽略具有column_x无效值的所有其他行。
任何人都可以帮我这么做吗? 非常感谢。
答案 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
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
;