Várias vezes encontrei-me trabalhando em dados que foram exportados para .sql
arquivos que quero processar em vez de importar para um banco de dados.
Estou falando apenas de arquivos sql de "dados puros". Aqueles que não têm nada além de INSERT INTO
declarações. (Eles podem ter algum prólogo no topo que eu possa ignorar.)
Geralmente, os arquivos terão muitas linhas que começam com INSERT INTO
e terminarão com ;
entre serão um número variável de "registros" começando com (
, terminando com )
e separados por ,
. Cada "registro" será composto de um número fixo de "campos" que também são separados por ,
.
O filtro deve retirar todas as instruções SQL, separadores, terminadores, etc. Ele deve produzir apenas um "registro" por linha com cada "campo" separado por digamos uma vírgula ou tabulação.
Na minha opinião, isso deve ser totalmente trivial e comum o suficiente para ter sido implementado muitas vezes. Mas parece que nunca consigo encontrar ferramentas ou scripts existentes.
Eu geralmente tento lidar com isso em Perl tratando ),(
como o separador de registro em vez de \n
, mas eu sempre fico preso em detalhes irritantes.
Alguém tem (ou pode fazer) um script realmente simples que faz isso? Eu não me importo se está em bash, sed, awk, Perl, Python, etc.
Aqui estão alguns dados reais de exemplo. Eu alterei para ter apenas alguns registros por linha. Os arquivos reais têm cerca de um milhão de caracteres por linha / declaração antes de alcançarem o ;
e começarem o próximo.
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');
A saída seria algo assim. Se campos são citados ou não provavelmente não importam. Vírgula ou tabulação separada não importa. Corrigir o escape de vírgulas seria necessário embora.
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'
Os dados com os quais normalmente estou trabalhando fazem parte dos despejos da Wikipedia e do Wikcionário.