2010-01-24 75 views
2

更新:添加了一个示例来说明数据的格式。DB将CSV加载到多个表中

考虑到与此格式的每一行一个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命令行工具 最适合这个吗?

回答

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 

此创建表1和表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 
+0

我假设通过“插入”您的意思是运行插入查询。这会比使用mysql加载数据infile类型的操作花费更长的时间。 Re:你的方法,你如何定义表格以便正确插入括号内的值?因为我们有一个未知数。 – hinghoo 2010-01-24 22:11:59

+0

你*不能*使用mysql加载数据infile这个,所以这是一个毫无意义的比较。不过,反正选入速度非常快。括号作为一个字段插入到登台表中(因为它们不包含逗号)。然后你用substring_index把它们拉出来。 – jspcal 2010-01-24 22:16:48

+0

jspcal:请参阅我上面添加的示例。 – hinghoo 2010-01-24 22:22:10

1

正如你所说的,有问题的部分是[tbl2.col1的数目不详:TB l2.col2]对在每行中声明。我试图通过sed来解决这个问题:将一个文件分成两个文件,每个文件一个文件。然后您可以使用load data infile将每个文件加载到其对应的表中。

相关问题