2013-05-14 32 views
0

批量的MySQL插入我有一個數據龐大的CSV文件,我試圖生成MySQL的BULK INSERT語句。awk的創建CSV

數據呈現爲以CSV

90927597|1356976813998|1356976814177|1356976817457|17756249959|17756249959|18663111085|17753220005|1090917|1775624995900|A 
90927599|1356976813098|1356976814797|1356976823738|12562175250|12562175250|12566502514|12565207040|1890362|1256217525000|A 
90927602|1356976813098|1356976814797|1356976823738|12562175250|12562175250|12566502514|12565207040|1890362|1256217525000|A 
90927603|1356976813098|1356976814797|1356976823738|12562175250|12562175250|12566502514|12565207040|1890362|1256217525000|A 

我希望創建一個批量插入,將每2行

MySQL的語句組合成單個插入語句與所需的輸出如下

insert into data (90927597,1356976813998,1356976814177,1356976817457,17756249959,17756249959,18663111085,17753220005,1090917,1775624995900,A,90927599,1356976813098,1356976814797,1356976823738,12562175250,12562175250,12566502514,12565207040,1890362,1256217525000,A); 
insert into data (90927602,1356976813098,1356976814797,1356976823738,12562175250,12562175250,12566502514,12565207040,1890362,1256217525000,A, 90927603,1356976813098,1356976814797,1356976823738,12562175250,12562175250,12566502514,12565207040,1890362,1256217525000,A); 

謝謝

回答

3
$ cat tst.awk 
BEGIN{ FS="|"; OFS="," } 
{ 
    $1 = $1 
    head = ((NR%2) == 1 ? tail "insert into data (" : ",") 
    printf "%s%s", head, $0 
    tail = ");\n" 
} 
END { printf "%s", tail } 

$ awk -f tst.awk file 
insert into data (90927597,1356976813998,1356976814177,1356976817457,17756249959,17756249959,18663111085,17753220005,1090917,1775624995900,A,90927599,1356976813098,1356976814797,1356976823738,12562175250,12562175250,12566502514,12565207040,1890362,1256217525000,A); 
insert into data (90927602,1356976813098,1356976814797,1356976823738,12562175250,12562175250,12566502514,12565207040,1890362,1256217525000,A,90927603,1356976813098,1356976814797,1356976823738,12562175250,12562175250,12566502514,12565207040,1890362,1256217525000,A); 
+0

Thanks Ed,我可以限制每個插入記錄的數量嗎?說每個插入100個記錄?可能嗎? – Deano 2013-05-14 13:52:38

+1

什麼是記錄? 「A」屬於哪裏?張貼一些典型的輸入和預期的輸出,因爲當我們回答一個問題,然後你說:「哦,不,其實我想要做不同的事情」,然後,我們必須弄清楚,是通過閱讀評論迭代什麼是非常令人沮喪。 – 2013-05-14 14:07:31

+0

Ed在所有應有的尊重,在我的問題的主體中提到的極限問題,我不想在得到回答後要求額外的。 謝謝你的幫助壽! – Deano 2013-05-14 14:15:24

1

隨着awk

$ awk 'BEGIN{printf "%s","insert into date ("}$NF{gsub(/\|/,",");printf "%s",$0}END{print ");"}' file 
insert into date (90927597,1356976813998,1356976814177,1356976817457,17756249959,17756249959,18663111085,17753220005,1090917,1775624995900,A90927599,1356976813098,1356976814797,1356976823738,12562175250,12562175250,12566502514,12565207040,1890362,1256217525000,A); 

一種更簡潔的方式使用tr

$ echo "insert into date ($(tr -d '\n' < file));" | tr '|' ',' 
insert into date (90927597,1356976813998,1356976814177,1356976817457,17756249959,17756249959,18663111085,17753220005,1090917,1775624995900,A90927599,1356976813098,1356976814797,1356976823738,12562175250,12562175250,12566502514,12565207040,1890362,1256217525000,A); 
+0

謝謝你,你知道,如果有一種方法可以AWK打印選項限制在每條語句100線? – Deano 2013-05-14 13:46:41

+0

'print'每條語句打印一行,我不使用'print' ..請說明你的意思。 – 2013-05-14 13:48:01

+0

現在,使用您的解決方案,我可以創建一個包含數千條記錄的巨大單一批量插入語句的大文件。 我可以拆分嗎?成多個批量聲明?每個可以說有100個記錄? – Deano 2013-05-14 13:50:43