Mysql DB将CSV加载到多个表中
更新:添加示例以澄清数据格式 考虑每行格式如下的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命令行工具 最适合做这个 不,不是直接的。
tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5,[tbl2.col1:tbl2.col2]+
其中[tbl2.col1:tbl2.col2]+表示可以有任意数量的这些对重复
例:
这些表将使用行号作为键相互关联,除了上面提到的任何列之外,还必须创建行号
mysql加载
数据填充
将数据加载到
两张分开的桌子不,不是直接的。加载数据只能插入到一个表或分区表中 您可以做的是将数据加载到暂存表中,然后使用
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