DB将CSV加载到多个表中

时间:2010-01-24 21:59:23

标签: mysql database unix bulk-load

更新:添加了一个示例来阐明数据的格式。

考虑CSV格式,每行格式如下:

tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5,[tbl2.col1:tbl2.col2]+

其中[tbl2.col1:tbl2.col2] +表示可能有任意数量的这些对重复

例如:

tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2

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

  1. 有没有办法使用mysql load data infile加载数据 两个单独的表?
  2. 如果没有,用什么Unix命令行工具 最适合这个吗?

2 个答案:

答案 0 :(得分:1)

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

您可以做的是将数据加载到临时表中,然后使用insert into选择2个最终表中的各列。如果您对tbl2的值使用不同的分隔符,则可能还需要substring_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

这将创建包含以下内容的table1和table 2文件:

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

答案 1 :(得分:1)

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