Importar CSV a SQLite

117

Estoy tratando de importar un archivo csv a una tabla SQLite.

Ejemplo csv:

1,2
5,6
2,7

Comando de ejemplo:

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

Ni siquiera estoy seguro de por qué encontraría cuatro columnas con seis datos y dos columnas.

Molly Walters
fuente
Parece que el comando espera encabezados de columna en la primera línea y que el terminador de línea no se reconoce como tal. 6 - 2 = 4
mechanical_meat
¿Puedo especificar un terminador de línea o falta uno en mi csv?
Molly Walters
1
No parece que pueda especificar el terminador de línea desde la herramienta de línea de comandos SQLite. ¿Tiene un editor de texto (como el Bloc de notas en Windows, pero mejor) que le mostrará los caracteres que terminan las líneas? Hay tres variaciones principales: \r\nen Windows, \nen * nix (incluye Mac más nuevas), \ren Mac más antiguas.
mechanical_meat
Estoy usando BBEdit, pero no veo ninguno de esos caracteres al final de las líneas. Intenté agregarlos manualmente, pero no parece hacer nada ...
Molly Walters
1
Este sitio web puede convertir un archivo CSV (o Excel) a SQLite - converttosqlite.com
Code Slinger

Respuestas:

153

Lo que también se dice en los comentarios, SQLite ve su entrada como 1, 25, 62, 7. También tuve un problema, y ​​en mi caso se resolvió cambiando "separador" por ".mode csv". Entonces podrías intentar:

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

El primer comando crea los nombres de las columnas de la tabla. Sin embargo, si desea que los nombres de las columnas se hereden del archivo csv, puede simplemente ignorar la primera línea.

NumesSanguis
fuente
83
Para otras personas que llegan aquí desde una búsqueda, si la primera línea de su archivo csv contiene los nombres de las columnas, entonces puede omitir el primer create tablecomando y sqlite usará los nombres de las columnas del archivo csv.
EarlCrapstone
2
@EarlCrapstone: ¿podrías dar más detalles? No parece funcionar para mí.
d33tah
3
@ d33tah Mira estos ejemplos . Observe cómo la primera línea contiene los nombres de las columnas Year,Make,Model,Description,Pricey no los datos reales. Si ese es el caso con su archivo CSV, entonces no necesita crear manualmente la tabla usando el create tablecomando. El .importcomando utilizará la primera línea de su archivo para determinar los nombres de las columnas y crear la tabla en consecuencia. Aún debe incluir el nombre de la tabla en el comando. La misma información de los documentos SQLite .
EarlCrapstone
¿Por qué estás sentado .mode? ¿No es eso solo para la salida?
Alan
Si encuentra que la tabla generada agrupa varias columnas juntas, verifique que no esté usando una palabra reservada como typepara el nombre de una columna CSV.
paulvs
29

Así es como lo hice.

  • Haga / convierta el archivo csv para que esté separado por pestañas (\ t) Y no entre comillas (sqlite interpreta las comillas literalmente, dice documentos antiguos)
  • Ingrese el shell sqlite de la base de datos a la que se deben agregar los datos

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

gyaani_guy
fuente
para varias filas, mi tsv necesitaba especificar el separador de FILA con este comando .separator "\t" "\r"
mfink
1
Cuando se habla de formatos de archivo, tsv! = Csv
Alan
24

Estoy fusionando información de respuestas anteriores aquí con mi propia experiencia. Lo más fácil es agregar los encabezados de la tabla separados por comas directamente a su archivo csv, seguido de una nueva línea, y luego todos sus datos csv.

Si nunca vuelve a hacer cosas de sqlite (como yo), esto podría ahorrarle una búsqueda en la web o dos:

En el shell de Sqlite ingrese:

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

Si no tiene Sqlite instalado en su Mac, ejecute

$ brew install sqlite3

Es posible que deba hacer una búsqueda en la web para saber cómo instalar Homebrew.

lukas_o
fuente
1
¿Cómo manejar las unescaped " characteralertas?
TMOTTM
Si crea una tabla antes de importarla, no buscará encabezados.
Rolf
Tengo que poner el archivo en la misma carpeta donde se encuentra sqlite3.exe. ¿Puedo usar otra ruta para el archivo csv?
Jaydeep Karena
Punto menor: "Si no tienes Sqlite instalado en tu Mac" ... AFAIK está instalado por defecto.
Laryx Decidua
8

antes del comando .import, escriba ".mode csv"

zeo
fuente
5
.mode es solo para salida
DeliriumTremens
9
Al parecer, no es así. Desde la sección .import doc: Tenga en cuenta que es importante establecer el "modo" en "csv" antes de ejecutar el comando ".import". Esto es necesario para evitar que el shell de la línea de comandos intente interpretar el texto del archivo de entrada como algún otro formato.
Richard - Rogue Wave Limited
8

Cómo importar un archivo csv a sqlite3

  1. Crear base de datos

    sqlite3 NYC.db
  2. Establecer el modo y el nombre de la tabla

    .mode csv tripdata
  3. Importe los datos del archivo csv a sqlite3

    .import yellow_tripdata_2017-01.csv tripdata
  4. Buscar tablas

    .tables
  5. Encuentra tu esquema de tabla

    .schema tripdata
  6. Buscar datos de la tabla

    select * from tripdata limit 10;
  7. Cuente el número de filas en la tabla

    select count (*) from tripdata;
sivamani
fuente
4

Con Termsql puedes hacerlo en una línea:

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

usuario3573558
fuente
el enlace estaba roto, lo cambió al repositorio de github, ¡aclare!
Andreas Niedermair
3

Tuve exactamente el mismo problema (en OS X Maverics 10.9.1 con SQLite3 3.7.13, pero no creo que SQLite esté relacionado con la causa). Traté de importar datos csv guardados desde MS Excel 2011, que por cierto. utiliza ';'como separador de columnas. Descubrí que el archivo csv de Excel todavía usa el carácter de nueva línea de Mac OS 9 veces, cambiarlo a unix nueva línea resolvió el problema. AFAIR BBEdit tiene un comando para esto, así como Sublime Text 2.

adass
fuente
2
Es más fácil de usar tr -s '\r' '\n'y funcionará con todo tipo de archivos aleatorios.
Donal Fellows
1

Sigue los pasos:-

  1. 1] nombre sqlite3 2] .mode csv tablename 3] .import Filename.csv tablename
Lalit Bangad
fuente
0

Como especifican algunos sitios web y otros artículos, es simple echar un vistazo a este. https://www.sqlitetutorial.net/sqlite-import-csv/

No necesitamos especificar el separador para el csvarchivo, porque csv significa separado por comas. sqlite> .separator ,no hay necesidad de esta línea.

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

Esto funcionará perfectamente :)

PD: My cities.csv con encabezado.


name,population
Abilene,115930
Akron,217074
Albany,93994
Albuquerque,448607
Alexandria,128283
Allentown,106632
Amarillo,173627
Anaheim,328014
Dupinder Singh
fuente
2
No olvides correr .save someFileNameal final. Me tomó una hora encontrar esto para finalmente exportarlo en el archivo de base de datos de memoria al disco 😅
ioopl