Exportar de sqlite para csv usando script de shell

89

Estou fazendo um script de shell para exportar uma consulta sqlite para um arquivo csv, assim:

 #!/bin/bash
./bin/sqlite3 ./sys/xserve_sqlite.db ".headers on"
./bin/sqlite3 ./sys/xserve_sqlite.db ".mode csv"
./bin/sqlite3 ./sys/xserve_sqlite.db ".output out.csv"
./bin/sqlite3 ./sys/xserve_sqlite.db "select * from eS1100_sensor_results;"
./bin/sqlite3 ./sys/xserve_sqlite.db ".exit"

Ao executar o script, a saída aparece na tela, ao invés de ser salva em "out.csv". Ele está funcionando do mesmo modo com a linha de comando, mas não sei por que o script de shell não consegue exportar dados para o arquivo.

O que estou fazendo errado?

Rorro
fonte

Respostas:

125

sqlite3

Você tem uma chamada separada para sqlite3para cada linha; no momento em que você selectcorre, você .out out.csvfoi esquecido.

Experimentar:

#!/bin/bash
./bin/sqlite3 ./sys/xserve_sqlite.db <<!
.headers on
.mode csv
.output out.csv
select * from eS1100_sensor_results;
!

em vez de.

métodos sh / bash

Você pode chamar seu script com um redirecionamento:

$ your_script >out.csv

ou você pode inserir o seguinte como uma primeira linha em seu script:

exec >out.csv

O primeiro método permite que você especifique nomes de arquivos diferentes, enquanto o último gera um nome de arquivo específico. Em ambos os casos, a linha .output out.csvpode ser ignorada.

tzot
fonte
Ótimo, obrigado, agora está funcionando! (e é necessário ">>" em vez de ">", mas sou um novato no Linux: D)
Rorro
1
Se uma resposta aqui realmente responder à sua pergunta, você deve clicar na marca de seleção abaixo do total de votos da resposta (ela deve aparecer em cinza claro para você). Isso marca a pergunta como respondida.
tzot
Desculpem a demora, sou um verdadeiro novato: D
Rorro
<<! ... !é exatamente o que eu precisava. Obrigado.
Rostyslav Druzhchenko
173

Em vez dos comandos de ponto, você pode usar as opções de comando sqlite3:

sqlite3 -header -csv my_db.db "select * from my_table;" > out.csv

Isso o torna um one-liner.

Além disso, você pode executar um arquivo de script sql:

sqlite3 -header -csv my_db.db < my_script.sql > out.csv

Use sqlite3 -helppara ver a lista de opções disponíveis.

Hollister
fonte
3
Muito, muito melhor ... esta deve ser a solução aceita! KISS :-)
pvandenberk
5
Esta solução também funcionará em windows, desde que sqlite3 esteja no seu caminho ou no mesmo diretório.
amenthes
7

Recentemente, criei um script de shell que poderá pegar as tabelas de um arquivo db e convertê-las em arquivos csv.

https://github.com/darrentu/convert-db-to-csv

Sinta-se à vontade para me fazer qualquer pergunta sobre o meu script :)

DarrenNEEDSHELP
fonte
3
Isso me ajudou. Você deve copiar e colar suas 10 linhas de código em sua resposta, então o voto positivo que eu já dei pareceria mais justificado.
mxmlnkn de
O script não contém aspas ao redor do nome da tabela (ele gera um erro se o nome da tabela tiver travessões)
Eric F.
0

Embora a questão seja sobre o script de shell, acho que ajudará poucos daqueles que estão apenas se preocupando em transferir os dados do banco de dados sqlite3 para um arquivo csv.

Eu encontrei uma maneira muito conveniente de fazer isso com o navegador firefox usando a extensão SQLite Manager.

Simplesmente conecte ao seu arquivo de banco de dados sqlite no firefox (gerenciador SQlite -> conectar banco de dados) e então Tabela -> Exportar tabela. Você terá mais algumas opções que você pode apenas clicar e experimentar ....

No final você obtém um arquivo csv com a tabela que você escolheu para ser exportada.

infoclogged
fonte
0
Using command line for Linux:

user@dell-Admin: sqlite3 #activate your sqlite database first
sqlite> .tables #search for tables if any available if already created one.
sqlite> .schema #if you want to check the schema of the table.

# once you find your table(s), then just do the following:

sqlite> .headers on   #export along with headers (column names)
sqlite> .mode csv     #file type is csv
sqlite> .output example.csv   #you want to provide file name to export
sqlite> SELECT * from events;    #If entire table is needed or select only required
sqlite> .quit    #finally quit the sqlite3

Agora procure em seu sistema o arquivo example.csv e você o obterá.

Jainmiah
fonte