2010-01-24 56 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將每個文件加載到其對應的表中。

相關問題