【问题标题】:Use mysqlimport with a subset of a file's columns将 mysqlimport 与文件列的子集一起使用
【发布时间】:2020-08-13 15:54:44
【问题描述】:

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

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

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

我认为它看起来像

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

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

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

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

【问题讨论】:

    标签: mysql linux bash mysqlimport


    【解决方案1】:

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

    但并非输入文件的所有字段都需要放入表的列中。

    嗯?

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

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

    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 |
    +------+------+------+
    

    【讨论】:

    • 很有趣,这肯定有用,但是输入有 52 列,所以有大约 45 列说@dummy 看起来很不雅...有没有办法说,将输入中的多列发送到此@dummy 变量中?喜欢--columns one,two,@dummy*7,ten
    • 您必须使用one,two,@dummy,@dummy,@dummy,@dummy,@dummy,@dummy,@dummy,ten。如果您不喜欢这样,请准备一个包含正确列的输入文件。 Sed 不是最好的工具,我会使用cut
    • 应该清楚,变量名@dummy没有什么特别之处。你可以使用@d 或任何你想要的东西。
    • 感谢所有这些提示!是的,我认为最好的办法可能是硬着头皮准备另一个文件。有趣的是,为什么cut 超过sed?它更快吗?
    • 使用cut就不用写正则表达式了。例如打印逗号分隔的字段 1、2、10:cut -d, -f1,2,10 阅读man cut 了解更多信息。
    猜你喜欢
    • 1970-01-01
    • 2013-04-03
    • 2016-05-12
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 2011-01-31
    • 1970-01-01
    相关资源
    最近更新 更多