2013-05-14 4 views
0

У меня огромный CSV-файл с данными, я пытаюсь сгенерировать инструкцию mySQL bulk insert.awk create bulk MySQL insert from 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

Спасибо Ed, могу ли я ограничить количество записей на вставку? скажем, 100 записей для каждой вставки? Является ли это возможным? – Deano

+1

Что такое запись? Где принадлежат «А»? Поместите некоторый ввод и ожидаемый результат, поскольку это очень расстраивает, когда мы отвечаем на один вопрос, а затем вы говорите «о, нет, на самом деле я хочу сделать что-то другое», а затем мы должны выяснить, что это такое, читая итерации комментариев. –

+0

При всем уважении Ed, вопрос о предельном вопросе упоминается в теле моего вопроса, и я не хотел спрашивать о дополнительных услугах после получения ответа. Спасибо за помощь! – Deano

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

+0

'print' печатает одну строку за сообщение, и я не использую' print' .. прошу прояснить, что вы имеете в виду. –

+0

прямо сейчас, используя ваше решение, я могу создать один большой файл с огромным однопозиционным вставкой, содержащим тысячи записей. Могу я разделить это? в несколько массовых заявлений? Кажется, у каждого есть 100 записей? – Deano