将 mysqlimport 与文件列的子集一起使用

Use mysqlimport with a subset of a file's columns

我有一个文件,比如说 data.csv,它正在进入我的服务器,我想将其导入到 MySQL 数据库中的 data table使用 mysqlimport.

我的问题是,此文件中的数据比我实际想要导入的数据多得多。它被我之前的另一台服务器使用,它需要所有这些数据,但我只需要其中的几列。

有没有办法指定我希望 mysqlimport 使用哪些列?

我认为它看起来像

mysqlimport --columns="field_1","field_2","field_42","field_31","field_16","field_4" db data.csv

但 table 只包含文件的前 6 个字段。如果需要,我可以重新排列 table 以便我想要的字段按顺序排列(即 运行 --columns="field_1","field_2","field_4","field_16",...)。

我隐约知道这可以使用 sed 来完成,但我很好奇 mysqlimport 是否原生支持它?

编辑: 接受的答案并不完全是我所希望的,但我认为答案是,“不,遗憾的是它不支持它”。无论如何,请查看已接受的答案和解决方法的评论!

--columns 选项不命名输入文件的列。它命名了您要导入到的目的地 table 的列。输入文件的所有字段都需要放在某个地方。 --columns 中的列数需要与输入文件的字段数一样多。

但并非输入文件的所有字段都需要进入您的 table 的列。

嗯?

这里有一个技巧(这在 LOAD DATA INFILE 中也有效):您可以将输入的字段“发送”到 table 的真实列或会话变量。这个变量只会被文件中输入的每一行覆盖,但这并不重要。将其视为代码项目中的虚拟变量。

示例:我创建了一个包含三列的 table。

mysql> create table mytable (one text, two text, four text);

我创建了一个包含四个字段的输入文本文件。

$ cat mytable.csv
one,two,three,four

在这里,我将字段导入到它们各自的列中,通过将其放入虚拟变量来跳过字段三。

$ mysqlimport --local --columns one,two,@dummy,four --fields-terminated-by=, test mytable.csv 

成功!

mysql> select * from mytable;
+------+------+------+
| one  | two  | four |
+------+------+------+
| one  | two  | four |
+------+------+------+