Эффективный фильтр для файлов .sql с помощью только «INSERT INTO»

Несколько раз я обнаружил, что работаю над данными, которые были экспортированы в файлы .sql которые я хочу обработать, а не импортировать в базу данных.

Я говорю только о "чистых данных" sql-файлах. Которые не имеют ничего, кроме INSERT INTO . (У них может быть пролог сверху, который я могу игнорировать).

Как правило, файлы будут иметь много строк, начинающихся с INSERT INTO и заканчивающихся ; между ними будет переменное число «записей», начинающихся с ( , заканчивающихся ) и разделенных с. Каждая «запись» будет состоять из фиксированного количества «полей», которые также разделены.

Фильтр должен выделять все операторы SQL, разделители, терминаторы и т. Д. Он должен выводить только одну «запись» на строку с каждым «полем», разделенным запятой или вкладкой.

По моему мнению, это должно быть совершенно тривиально и достаточно распространено, что это должно было быть реализовано много раз. Но я никогда не могу найти существующие инструменты или скрипты.

Обычно я пытаюсь справиться с этим в Perl, рассматривая ),( как разделитель записей вместо \n но я всегда застреваю в раздражающих деталях.

Кто-нибудь получил (или может сделать) действительно простой скрипт, который делает это? Меня не волнует, есть ли это в bash, sed, awk, Perl, Python и т. Д.

Вот некоторые реальные примеры данных. Я изменил его, чтобы иметь только несколько записей в строке. Фактические файлы имеют около миллиона символов в строке / заявлении, прежде чем они достигнут ; и начните следующую.

 INSERT INTO `categorylinks` VALUES (0,'Wikisaurus','RunJobs.php','2008-01-27 03:10:30','','','page'),(8,'Wiktionary','TEXT OF THE GNU FREE DOCUMENTATION LICENSE','2011-01-26 23:50:34','','uppercase','page'),(12,'Wiktionary','WHAT WIKTIONARY IS NOT\nWHAT WIKTIONARY IS NOT','2011-04-10 18:22:23','What Wiktionary is not','uppercase','page'),(12,'Wiktionary:Help','WHAT WIKTIONARY IS NOT\nWHAT WIKTIONARY IS NOT','2011-04-10 18:22:23','What Wiktionary is not','uppercase','page'); INSERT INTO `categorylinks` VALUES (2184,'Swedish_nouns','RELIGION','2011-01-06 00:04:41','','uppercase','page'),(2184,'Translations_to_be_checked_(Albanian)','RELIGION','2007-01-27 08:16:34','','uppercase','page'),(2184,'Translations_to_be_checked_(Bulgarian)','RELIGION','2007-01-27 08:16:34','','uppercase','page'); 

Результат будет примерно таким. Являются ли поля цитируемыми или нет, вероятно, не имеет значения. Запятая или вкладка не имеет значения. Тем не менее, потребуется правильное экранирование запятых.

  0,'Wikisaurus','RunJobs.php','2008-01-27 03:10:30','','','page' 8,'Wiktionary','TEXT OF THE GNU FREE DOCUMENTATION LICENSE','2011-01-26 23:50:34','','uppercase','page' 12,'Wiktionary','WHAT WIKTIONARY IS NOT\nWHAT WIKTIONARY IS NOT','2011-04-10 18:22:23','What Wiktionary is not','uppercase','page' 12,'Wiktionary:Help','WHAT WIKTIONARY IS NOT\nWHAT WIKTIONARY IS NOT','2011-04-10 18:22:23','What Wiktionary is not','uppercase','page' 2184,'Swedish_nouns','RELIGION','2011-01-06 00:04:41','','uppercase','page' 2184,'Translations_to_be_checked_(Albanian)','RELIGION','2007-01-27 08:16:34','','uppercase','page' 2184,'Translations_to_be_checked_(Bulgarian)','RELIGION','2007-01-27 08:16:34','','uppercase','page' 

Данные, с которыми я обычно работаю, являются частью дампов Википедии и Викисловаря.

One Solution collect form web for “Эффективный фильтр для файлов .sql с помощью только «INSERT INTO»”

Это было бы тривиально:

1) Импорт данных SQL в базу данных SQL

2) Выведите данные в нужном формате с помощью любого из инструментов SQL для этого уже существующего. Например, SELECT INTO OUTFILE

И это вполне возможно для сценариев. Если есть проблемы с скоростью, получите более быстрое оборудование, особенно диски. Если вы абсолютно хотите разобрать это на каком-либо другом языке, вы, вероятно, обнаружите, что пишете полный синтаксический анализатор SQL, чтобы иметь дело со всеми цитатами / привязками / зарезервированными словами и т. Д. Хотя это определенно выполнимо, я бы не считал его тривиальным ,

  • REGEX поиск и замена с помощью sed или другой команды
  • Tomcat, SQL, Kerberos, о, мой!
  • Комбинация uniq и agrep?
  • Преобразование операторов XML в SQL INSERT с использованием командной строки
  • Исключение переменных bash перед их сохранением в базе данных hive apache
  • Передача нескольких varibles скрипту для SQL-запроса
  • Как регистрировать данные таблицы PostgreSQL в syslog?
  • dovecot mysql-connection ошибка из-за специального charater в config
  • Сравните два выходных файла sql с именами столбцов и распечатайте разницу в другой файл
  • Awk one-liner для печати столбца таблицы SQL?
  • Изменение типов столбцов столбцов в базе данных Hive
  • Linux и Unix - лучшая ОС в мире.