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.


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.


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


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.


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"


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;


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.


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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.