Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql DB将CSV加载到多个表中_Mysql_Database_Unix_Bulk Load - Fatal编程技术网

Mysql DB将CSV加载到多个表中

Mysql DB将CSV加载到多个表中,mysql,database,unix,bulk-load,Mysql,Database,Unix,Bulk Load,更新:添加示例以澄清数据格式 考虑每行格式如下的CSV: tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5,[tbl2.col1:tbl2.col2]+ 其中[tbl2.col1:tbl2.col2]+表示可以有任意数量的这些对重复 例: 这些表将使用行号作为键相互关联,除了上面提到的任何列之外,还必须创建行号 有没有办法使用mysql加载 数据填充将数据加载到 两张分开的桌子 如果不是,有哪些Unix命令行工具 最适合做这个 不,不是直接的。

更新:添加示例以澄清数据格式

考虑每行格式如下的CSV:

tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5,[tbl2.col1:tbl2.col2]+
其中[tbl2.col1:tbl2.col2]+表示可以有任意数量的这些对重复

例:

这些表将使用行号作为键相互关联,除了上面提到的任何列之外,还必须创建行号

  • 有没有办法使用
    mysql加载
    数据填充
    将数据加载到 两张分开的桌子
  • 如果不是,有哪些Unix命令行工具 最适合做这个

  • 不,不是直接的。加载数据只能插入到一个表或分区表中

    您可以做的是将数据加载到暂存表中,然后使用
    insert-into
    将各个列选择到最终的两个表中。如果对tbl2的值使用不同的分隔符,则可能还需要
    substring\u index
    。行号由临时表中的自动递增列处理(最简单的方法是使自动列在临时表定义中的最后一个)

    格式并不十分清晰,最好使用/perl/php/python,但是如果您真的想使用shell工具:

    cut -d , -f 1-5 file | awk -F, '{print NR "," $0}' > table1
    
    cut -d , -f 6- file | sed 's,\:,\,,g' | \
      awk -F, '{i=1; while (i<=NF) {print NR "," $(i) "," $(i+1); i+=2;}}' > table2
    


    正如您所说,有问题的部分是每行中声明的[tbl2.col1:tbl2.col2]对的未知数量。我想通过
    sed
    :将一个文件拆分为两个文件,每个表一个。然后您可以使用
    load data infle
    将每个文件加载到相应的表中。

    我假设“Insert into”是指运行插入查询。这将比mysql加载数据填充类型的操作花费更长的时间。Re:您的方法是,如何定义表格,以便正确插入括号内的值?因为我们有一个未知的数量,也就是说。你不能使用mysql加载数据填充来实现这一点,所以这是一个毫无意义的比较。然而,无论如何,选择进入是非常快的。括号作为一个字段插入临时表(因为它们不包含逗号)。然后用substring_index.jspcal将它们取出:请参见我在上面添加的示例。为您的最新示例添加了一些awk
    cut -d , -f 1-5 file | awk -F, '{print NR "," $0}' > table1
    
    cut -d , -f 6- file | sed 's,\:,\,,g' | \
      awk -F, '{i=1; while (i<=NF) {print NR "," $(i) "," $(i+1); i+=2;}}' > table2
    
    1,tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5
    2,tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5
    3,tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5
    
    1,tbl2.col1,tbl2.col2
    1,tbl2.col1,tbl2.col2
    2,tbl2.col1,tbl2.col2
    2,tbl2.col1,tbl2.col2
    3,tbl2.col1,tbl2.col2
    3,tbl2.col1,tbl2.col2