es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Importa espacios vacíos sin comillas como NULL desde un archivo CSV a SQLite usando la CLI.

test.csv se ve así:


"Code","Miembro","Posición","ModDate"
"AAN","Smith, John",,1/21/2020 0:00:00
"AAN","Doe, Ron",,1/21/2020 0:00:00
"AAN","Doe, Jane","C",1/21/2020 0:00:00

Tenga en cuenta que faltan 2 valores en la columna Posición. Están en blanco. No hay comillas, ni '' ni "", solo espacio vacío entre 2 comas: ,,.

¿Es posible importar esos valores como NULL en SQLite utilizando la CLI sqlite3? Hasta ahora, solo los importa como cadenas vacías: ''. (Sí, podría usar Python o ejecutar UPDATE ... SET (ver más adelante), pero me pregunto si un simple comando CLI será suficiente.)

De otra manera, quiero ejecutar esta consulta para obtener filas con posiciones faltantes:

sql
SELECT *
FROM tbl
WHERE position IS NULL
;

Pero hasta ahora solo he logrado ese resultado con esta consulta:

sql
SELECT *
FROM tbl
WHERE position = ''
;


Primero intenté con lo predeterminado:

sh
sqlite3 -csv test.db ".import test.csv tbl"

Como dije, esto importa los valores nulos como cadenas vacías.

sqlite3‘s -help texto menciona una opción -nullvalue:


-nullvalue TEXTO establece la cadena de texto para los valores NULL. Por defecto es ''

Supongo que esto es para importar. Intento esto:

sh
sqlite3 -csv -nullvalue ",," test.db ".import test.csv tbl"

No hay suerte. Y no sé qué más intentar. No puedo encontrar ninguna explicación adicional de la opción -nullvalue en la documentación de SQLite ni ningún ejemplo con Google.


Tal vez simplemente pueda actualizar estos valores después de la importación, como se respondió aquí:

sh
sqlite3 -csv test.db ".import test.csv tbl"
sqlite3 test.db
sqlite> UPDATE tbl SET position = NULL WHERE position = '';

Sin embargo, esto no es del todo satisfactorio. Primero, tengo varios CSV y varias columnas dentro de cada uno de ellos que debo actualizar. Esto requeriría repetición. ¿Hay una mejor manera?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Después de investigar la documentación de SQLite y experimentar con la opción -nullvalue, no parece ser posible importar directamente espacios vacíos entre comas como valores NULL utilizando la interfaz de línea de comandos de sqlite3.

    Una solución alternativa sería importar el archivo CSV y luego actualizar la tabla para establecer los valores vacíos como NULL. Sin embargo, esto sería tedioso y repetitivo para varios archivos CSV y columnas.

    Una posible solución es utilizar un script de Python para leer el archivo CSV, reemplazar cualquier valor vacío por NULL y luego insertar los datos en la base de datos SQLite. Este script se puede modificar para manejar varios archivos CSV y columnas, lo que lo convierte en una solución más eficiente y flexible.

    Otra opción sería utilizar un script de shell para manipular el archivo CSV antes de importarlo en SQLite. El comando sed puede usarse para reemplazar los valores vacíos por una cadena de marcador de posición, que luego se puede reemplazar por NULL utilizando la función REPLACE de SQLite después de importar los datos. Este enfoque requeriría ciertos conocimientos de scripting de shell y expresiones regulares.

Comments are closed.