shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Transformar um arquivo Sql com Insert Simples em Mult


From: Jonathan Lessa
Subject: Re: [shell-script] Transformar um arquivo Sql com Insert Simples em Multiplos Inserts
Date: Tue, 29 Jan 2013 09:44:15 -0300

Não sei se é a melhor forma, em termos de performance, mas segue meu pitaco
de ajuda, obs. serve para arquivos com inserts em diversas tabelas:

[jonathan@cedro jonathan]$ cat insert.sql
INSERT INTO `chamado_anexo` VALUES ('00000000001', '00000001088',
'd21cca9.doc', 'AS 035');
INSERT INTO `chamado_anexo` VALUES ('00000000002', '00000001088',
'6ba2964.doc', 'AS 036');
INSERT INTO `chamado_anexo` VALUES ('00000000003', '00000001109',
'6f079cd.doc', 'AS 037');
INSERT INTO `chamado_fechado` VALUES ('00000000001', '00000001088',
'd21cca9.doc', 'AS 035');
INSERT INTO `chamado_anexo` VALUES ('00000000002', '00000001088',
'6ba2964.doc', 'AS 036');
INSERT INTO `chamado_anexo` VALUES ('00000000003', '00000001109',
'6f079cd.doc', 'AS 037');
INSERT INTO `chamado_fechado` VALUES ('00000000004', '00000001124',
'cec2d7e.pdf', 'Mensagem Oficial 3_2010');
INSERT INTO `chamado_anexo` VALUES ('00000000004', '00000001124',
'cec2d7e.pdf', 'Mensagem Oficial 3_2010');
INSERT INTO `usuarios` VALUES ('00000000005', '00000001145', '3d0b44e.jpg',
'Mensagem de vís - CZS');

[jonathan@cedro jonathan]$ for tb in $(grep -o "\`.*\`" insert.sql | sort |
uniq); do echo $(grep $tb insert.sql)| sed -r "s/; ([0-9a-zA-Z_ \`-]+)/,
/g"; done;
INSERT INTO `chamado_anexo` VALUES ('00000000001', '00000001088',
'd21cca9.doc', 'AS 035'), ('00000000002', '00000001088', '6ba2964.doc', 'AS
036'), ('00000000003', '00000001109', '6f079cd.doc', 'AS 037'),
('00000000002', '00000001088', '6ba2964.doc', 'AS 036'), ('00000000003',
'00000001109', '6f079cd.doc', 'AS 037'), ('00000000004', '00000001124',
'cec2d7e.pdf', 'Mensagem Oficial 3_2010');
INSERT INTO `chamado_fechado` VALUES ('00000000001', '00000001088',
'd21cca9.doc', 'AS 035'), ('00000000004', '00000001124', 'cec2d7e.pdf',
'Mensagem Oficial 3_2010');
INSERT INTO `usuarios` VALUES ('00000000005', '00000001145', '3d0b44e.jpg',
'Mensagem de vís - CZS');






Em 29 de janeiro de 2013 08:55, Robson Alexandre
<address@hidden>escreveu:

> **
>
>
> Bom Dia prezados colegas,
>
> Criei um script para realizar a rotina de converter um arquivo sql com
> Inserts simples,
> p.e.
> INSERT INTO `chamado_anexo` VALUES ('00000000001', '00000001088',
> 'd21cca9.doc', 'AS 035');
> INSERT INTO `chamado_anexo` VALUES ('00000000002', '00000001088',
> '6ba2964.doc', 'AS 036');
> INSERT INTO `chamado_anexo` VALUES ('00000000003', '00000001109',
> '6f079cd.doc', 'AS 037');
> INSERT INTO `chamado_anexo` VALUES ('00000000004', '00000001124',
> 'cec2d7e.pdf', 'Mensagem Oficial 3_2010');
> INSERT INTO `chamado_anexo` VALUES ('00000000005', '00000001145',
> '3d0b44e.jpg', 'Mensagem de vírus - CZS');
>
> em um arquivo sql com multiplos inserts
> p.e.
> INSERT INTO `chamado_anexo` VALUES ('00000000001', '00000001088',
> 'd21cca9.doc', 'AS 035'),
> ('00000000002', '00000001088', '6ba2964.doc', 'AS 036'),
> ('00000000003', '00000001109', '6f079cd.doc', 'AS 037'),
> ('00000000004', '00000001124', 'cec2d7e.pdf', 'Mensagem Oficial 3_2010'),
> ('00000000005', '00000001145', '3d0b44e.jpg', 'Mensagem de vírus - CZS');
>
> Então fiz o seguinte script
>
> #!/bin/bash
> arqSql=$HOME/Projetos/scripts/sql/simples.sql
> tmpSql=$(mktemp)
> sed 's/`//g' $arqSql > $tmpSql
> while read num insert
> do
> if [ "$num" -gt 1 ]
> then
> sed -i ":a;N;$ ! ba;s/$insert/###STRING###/1" $tmpSql
> sed -i ":a;N;$ ! ba;s/;\r\n$insert/,\r\n/g" $tmpSql
> sed -i "s/###STRING###/$insert/" $tmpSql
> fi
> done < <(awk '{print $1,$2,$3,$4}' $tmpSql | uniq -c)
>
> Só que está demasiadamente lento, visto que o arquivo possui mais de 600K
> linhas.
> Os senhores conhecem alguma ferramenta que faça essa função ou uma maneira
> de melhorar o desempenho do script?
>
> O algoritmo que estou utilizando é pegar as linhas com mais de 1
> INSERT INTO tb_blablabla VALUES
> substituir a primeira por uma string padrão
> substituir todas as outras por " , "
> e substituir a string padrao novamente pelo INSERT INTO tb_blabla VALUES.
>
> Pensei em sei lá, montar um arquivo .sed com todas as substituições e rodar
> o sed uma única vez..
> Alguém tem alguma dica?
>
> Atenciosamente
>
> Robson Alexandre
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  
>



-- 
Att.:
Jonathan Lessa


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

[Prev in Thread] Current Thread [Next in Thread]