Com o seguinte script de shell,
- eu li o arquivo
- e para cada linha
- gera fragmentos SQL
#!/bin/bash
CURRDATE=$(date +'%Y-%m-%d %H:%M:%S')
echo $CURRDATE
echo $OUTPUT
echo "SET SESSION AUTOCOMMIT = 0;" > $OUTPUT
echo 'START TRANSACTION;' >> $OUTPUT
echo $'INSERT INTO ...' >> $OUTPUT
echo 'VALUES' >> $OUTPUT
cat $INPUT | tr -d '\r' | while IFS= read -r LINE; do
echo $"(..., '$LINE', ...)," >> $OUTPUT
done
echo "COMMIT;" >> $OUTPUT
A saída é assim,
SET SESSION AUTOCOMMIT = 0;
START TRANSACTION;
SET @created_at = '2024-08-09 09:30:45';
INSERT INTO ...
VALUES
(...),
(...),
(...), -- <<<<<<<<<<<<<<<< should be a semi-colon
COMMIT;
Como pode suprimir a última vírgula? Para que eu coloque ponto e vírgula?
Isso é algo muito simples de fazer,
awk
uma vez que você entende como fazer . Eu uso isso para "sqlificar" qualquer lista de itens em uma lista compatível com SQL. Você pode adaptar as seçõesBEGIN
eEND
para adicionar instruções extras e outros preâmbulos necessários antes (e depois) de sua lista de valores:Exemplo de uso:
A lógica é:
,
O resultado disso é que, como estamos imprimindo as vírgulas nas linhas após cada valor, nenhuma vírgula é impressa para o último valor.
No meu exemplo, pego uma lista de valores e produzo uma lista entre aspas e separada por vírgula. Se você não precisar adicionar aspas, altere a
printf
linha de acordo. (Agsub
linha escapará corretamente de quaisquer aspas fortes em seus valores para que o SQL faça o que é pretendido/esperado)Eu acredito que isso fará o que você deseja:
O -n para o eco diz para não incluir uma nova linha após a saída.
Equivalente em Perl para o sqlifier do DopeGhoti:
Versão de uma linha:
-l
: autochomp / autoappend o separador de registro de entrada (\n
)-0777
: leia todo o arquivo/STDIN de uma só vez-F'\n'
: defina o separador do campo de entrada como um caractere de nova linha e divida automaticamente todo o arquivo/STDIN no separador do campo de entrada; ativar o loop automático-e "[...]"
: para cada campo, substitua aspas simples por aspas simples duplas, envolvendo a string resultante entre aspas simples; junte todos os campos usando,
como separador e imprima a string resultante, entre parêntesesNota : Em versões mais antigas do Perl, pode ser necessário adicionar as opções
-a
e-n
(para ativar a divisão automática e o loop automático); no Perl 5.20.0 ou mais recente, ambos estão implícitos em-F
.