Importar CSV para SQLite


117

Estou tentando importar um arquivo csv para uma tabela SQLite.

Exemplo csv:

1,2
5,6
2,7

Comando de exemplo:

sqlite> create table foo(a, b);
sqlite> .separator ,
sqlite> .import test.csv foo
Error: test.csv line 1: expected 2 columns of data but found 4

Eu nem tenho certeza por que ele encontraria quatro colunas com seis dados e duas colunas.


Parece que o comando espera cabeçalhos de coluna na primeira linha e que o terminador de linha não está sendo reconhecido como tal. 6 - 2 = 4
Mechanical_meat

Posso especificar um terminador de linha ou falta um no meu csv?
Molly Walters

1
Não parece que você pode especificar o terminador de linha da ferramenta de linha de comando SQLite. Você tem um editor de texto (como o Notepad no Windows, mas melhor) que mostrará os caracteres de terminação de linha? Existem três variações principais: \r\nno Windows, \nno * nix (inclui Macs mais recentes), \rem Macs mais antigos.
Mechanical_meat

Estou usando o BBEdit, mas não vejo nenhum desses caracteres no final das linhas. Tentei adicioná-los manualmente, mas não parece fazer nada ...
Molly Walters

1
Este site pode converter um arquivo CSV (ou Excel) para SQLite - converttosqlite.com
Code Slinger

Respostas:


153

O que também está sendo dito nos comentários, o SQLite vê sua entrada como 1, 25, 62, 7. Eu também tive um problema com, e no meu caso foi resolvido mudando "separador" para ".mode csv". Então você pode tentar:

sqlite> create table foo(a, b);
sqlite> .mode csv
sqlite> .import test.csv foo

O primeiro comando cria os nomes das colunas da tabela. No entanto, se quiser que os nomes das colunas sejam herdados do arquivo csv, você pode simplesmente ignorar a primeira linha.


83
Para outras pessoas que chegaram aqui a partir de uma pesquisa, se a primeira linha de seu arquivo csv contiver os nomes das colunas, você pode omitir o primeiro create tablecomando e o sqlite usará os nomes das colunas do arquivo csv.
EarlCrapstone

2
@EarlCrapstone: você poderia explicar? Não parece funcionar para mim.
d33tah

3
@ d33tah Veja estes exemplos . Observe como a primeira linha contém os nomes das colunas Year,Make,Model,Description,Pricee não os dados reais. Se for esse o caso com seu arquivo CSV, você não precisa criar manualmente a tabela usando o create tablecomando. O .importcomando usará a primeira linha do arquivo para determinar os nomes das colunas e criar a tabela de acordo. Você ainda deve incluir o nome da tabela no comando. As mesmas informações dos documentos SQLite .
EarlCrapstone de

Por que você está definindo .mode? Isso não é apenas para saída?
Alan

Se você descobrir que a tabela gerada agrupa várias colunas, verifique se não está usando uma palavra reservada, como typepara um nome de coluna CSV.
paulvs

29

Veja como eu fiz.

  • Criar / converter o arquivo csv para ser separado por tabulações (\ t) E não entre aspas (sqlite interpreta aspas literalmente - diz documentos antigos)
  • Insira o shell sqlite do banco de dados ao qual os dados precisam ser adicionados

    sqlite> .separator "\t" ---IMPORTANT! should be in double quotes sqlite> .import afile.csv tablename-to-import-to


para várias linhas, meu tsv precisava especificar o separador de linha com este comando .separator "\t" "\r"
mfink

1
Ao discutir formatos de arquivo, tsv! = Csv Consulte tools.ietf.org/html/rfc4180
Alan

24

Estou mesclando informações de respostas anteriores aqui com minha própria experiência. O mais fácil é adicionar os cabeçalhos de tabela separados por vírgula diretamente ao seu arquivo csv, seguido por uma nova linha e, em seguida, todos os seus dados csv.

Se você nunca mais usar o sqlite (como eu), isso pode economizar uma ou duas pesquisas na web:

No shell Sqlite, digite:

$ sqlite3 yourfile.sqlite
sqlite>  .mode csv
sqlite>  .import test.csv yourtable
sqlite>  .exit

Se você não instalou o Sqlite em seu Mac, execute

$ brew install sqlite3

Você pode precisar fazer uma pesquisa na web para saber como instalar o Homebrew.


1
Como lidar com unescaped " characteralertas?
TMOTTM

Se você criar uma tabela antes de importar, ela não procurará cabeçalhos.
Rolf

Tenho que colocar o arquivo na mesma pasta onde se encontra o sqlite3.exe. Posso usar outro caminho para o arquivo csv?
Jaydeep Karena

Ponto menor: "Se você não tem o Sqlite instalado no seu Mac" ... AFAIK é instalado por padrão.
Laryx Decidua

8

antes do comando .import, digite ".mode csv"


5
.mode é apenas para saída
DeliriumTremens

9
Aparentemente, não. Na seção .import doc: Observe que é importante definir o "modo" como "csv" antes de executar o comando ".import". Isso é necessário para evitar que o shell da linha de comando tente interpretar o texto do arquivo de entrada como algum outro formato.
Richard - Rogue Wave Limited

8

Como importar arquivo csv para sqlite3

  1. Criar banco de dados

    sqlite3 NYC.db
  2. Defina o modo e nome da tabela

    .mode csv tripdata
  3. Importe os dados do arquivo csv para sqlite3

    .import yellow_tripdata_2017-01.csv tripdata
  4. Encontre mesas

    .tables
  5. Encontre o seu esquema de tabela

    .schema tripdata
  6. Encontre os dados da tabela

    select * from tripdata limit 10;
  7. Conte o número de linhas na tabela

    select count (*) from tripdata;

4

Com o Termsql, você pode fazer isso em uma linha:

termsql -i mycsvfile.CSV -d ',' -c 'a,b' -t 'foo' -o mynewdatabase.db


o link foi quebrado, alterei-o para o repositório github - esclareça!
Andreas Niedermair

3

Tive exatamente o mesmo problema (no OS X Maverics 10.9.1 com SQLite3 3.7.13, mas não acho que o SQLite esteja relacionado à causa). Tentei importar dados csv salvos do MS Excel 2011, que btw. usa ';'como separador de colunas. Descobri que o arquivo csv do Excel ainda usa o caractere de nova linha do Mac OS 9 vezes, alterá-lo para nova linha unix resolveu o problema. O AFAIR BBEdit possui um comando para isso, assim como o Sublime Text 2.


2
É mais fácil de usar tr -s '\r' '\n'e funciona com todos os tipos de arquivos aleatórios.
Donal Fellows

1

Siga os passos:-

  1. 1] sqlite3 name 2] .mode csv tablename 3] .import Filename.csv tablename

0

Como alguns sites e outros artigos especificam, é simples dar uma olhada neste. https://www.sqlitetutorial.net/sqlite-import-csv/

Não precisamos especificar o separador para o csvarquivo, porque csv significa separado por vírgula. sqlite> .separator ,não há necessidade desta linha.

sqlite> create table cities(name, population);
sqlite> .mode csv
sqlite> .import c:/sqlite/city_no_header.csv cities

Isso funcionará perfeitamente :)

PS: My cities.csv with header.


name,population
Abilene,115930
Akron,217074
Albany,93994
Albuquerque,448607
Alexandria,128283
Allentown,106632
Amarillo,173627
Anaheim,328014

2
Não se esqueça de correr .save someFileNameno final. Levei horas para encontrar isso e finalmente exportá-lo no arquivo de banco de dados de memória para o disco 😅
ioopl
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.