Olá,
Estou tentando fazer um script que insere dados em um banco de dados SQLite a partir de um arquivo CSV, modificando alguns dados antes de inserir. Eis o script: ---- #!/bin/dash fonte=depois-da-perda.csv while read linha do #Coletando os campos e processando o campo4 campo1=$(echo $linha | cut -d";" -f 1) campo2=$(echo $linha | cut -d";" -f 2) campo4=$(echo $linha | cut -d";" -f 4 | tr , .) #Processando os demais campos campo1=$(printf "%06d" $campo1) if test $campo2 -lt 0 then campo2=0 fi #Gravando no banco de dados sqlite3 stockbot.db <<EOF INSERT INTO produtos (codigo, estoque, custo) VALUES ($campo1, $campo2, $campo4); EOF done < $fonte ---- Ele funciona como esperado, mas há um problema. O comando sqlite3 não lida com concurrency no banco de dados. Se outro processo estiver fazendo consultas no banco de dados (comando SELECT em SQL), a gravação dos dados no script supracitado falha. Então minha conversão de CSV em SQLite têm perda de dados caso outro processo esteja consultando dados no mesmo banco de dados. Felizmente, quando isso acontece, o sqlite3 sai com exit code 1. Então eu precisaria fazer um loop com o comando do sqlite3 (linhas 15, 16 e 17) que só saísse dele quando o exit code fosse 0. Eu experimentei com bash: until [ $? = 0 ]; do sqlite3 stockbot.db <<EOF INSERT INTO produtos (codigo, estoque, custo) VALUES ($campo1, $campo2, $campo4); EOF done Mas não deu certo. Alguma sugestão? Desde já agradeço a atenção dispensada, Kurt Kraut ([email protected]) PS: Caso precisam experimentar, coloco abaixo 5 linhas do depois-da-perda.csv: 16;4;;5,69 17;4;;9,67 18;3;;9,67 19;3;;9,18 20;0;;4,44 [As partes desta mensagem que não continham texto foram removidas]
