2013-05-14 67 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