Um filtro eficiente para arquivos .sql com apenas "INSERT INTO"

4

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.

    
por hippietrail 19.11.2011 / 13:30

1 resposta

1

Isso seria trivial:

1) Importe os dados do SQL para um banco de dados SQL

2) Emita os dados no formato desejado com qualquer uma das ferramentas SQL para fazer isso que já existem. Por exemplo. SELECT INTO OUTFILE

E isso é totalmente roteirizado. Se houver problemas de velocidade, obtenha hardware mais rápido, especialmente unidades. Se você absolutamente quer analisar isso em alguma outra linguagem, você provavelmente se encontrará escrevendo um analisador SQL completo, apenas para lidar com todas as palavras / chaves / palavras reservadas etc. Embora isso seja definitivamente factível, eu não consideraria trivial .

    
por 31.12.2011 / 19:00