Tengo un archivo que puede contener de 3 a 4 columnas de valores numéricos que están separados por comas. Los campos vacíos se definen con la excepción cuando están al final de la fila:
1,2,3,4,5
1,2,3,,5
1,2,3
La siguiente tabla fue creada en MySQL:
+ ------- + -------- + ------ + ----- + --------- + ------- + El | Campo | Tipo | Nulo | Clave | Predeterminado | Extra | + ------- + -------- + ------ + ----- + --------- + ------- + El | uno | int (1) | SI | El | NULL | El | El | dos | int (1) | SI | El | NULL | El | El | tres | int (1) | SI | El | NULL | El | El | cuatro | int (1) | SI | El | NULL | El | El | cinco | int (1) | SI | El | NULL | El | + ------- + -------- + ------ + ----- + --------- + ------- +
Estoy tratando de cargar los datos usando el comando MySQL LOAD:
LOAD DATA INFILE '/tmp/testdata.txt' INTO TABLE moo FIELDS
TERMINATED BY "," LINES TERMINATED BY "\n";
La tabla resultante:
+ ------ + ------ + ------- + ------ + ------ + El | uno | dos | tres | cuatro | cinco | + ------ + ------ + ------- + ------ + ------ + El | 1 | 2 | 3 | 4 | 5 | El | 1 | 2 | 3 | 0 | 5 | El | 1 | 2 | 3 | NULL | NULL | + ------ + ------ + ------- + ------ + ------ +
El problema radica en el hecho de que cuando un campo está vacío en los datos sin procesar y no está definido, MySQL por alguna razón no usa el valor predeterminado de las columnas (que es NULL) y usa cero. NULL se usa correctamente cuando falta el campo por completo.
Desafortunadamente, tengo que poder distinguir entre NULL y 0 en esta etapa para que cualquier ayuda sea apreciada.
Gracias S.
editar
La salida de SHOW WARNINGS:
+ --------- + ------ + -------------------------------- ------------------------ + El | Nivel | Código | Mensaje | + --------- + ------ + -------------------------------- ------------------------ + El | Advertencia | 1366 Valor entero incorrecto: '' para la columna 'cuatro' en la fila 2 | El | Advertencia | 1261 La fila 3 no contiene datos para todas las columnas | El | Advertencia | 1261 La fila 3 no contiene datos para todas las columnas | + --------- + ------ + -------------------------------- ------------------------ +
mysql
csv
load-data-infile
Spiros
fuente
fuente
LOAD DATA
. Consulte la sección de ejemplos d6tstack SQL sobre cambios en el esquema de datos.Respuestas:
Esto hará lo que quieras. Lee el cuarto campo en una variable local y luego establece el valor del campo real en NULL, si la variable local termina conteniendo una cadena vacía:
Si todos están posiblemente vacíos, los leería todos en variables y tendría varias instrucciones SET, como esta:
fuente
''
cuando descargan un csv (usandoIFNULL(Col,'')
en laSELECT INTO OUTFILE
consulta) para Excel, pero luego las suben y las aceptan como nulas frente a tener que lidiar\N
en el csv. ¡Gracias!0
que deberían convertirseNULL
(porque no es posible tener un valor cero para los datos en cuestión) y también cadenas vacías. ¿Cómo asegurarse de que tanto los ceros como las cadenas vacías se conviertenNULL
?nullif(@vone, 0)
.El manual de MySQL dice:
Por lo tanto, debe reemplazar los espacios en blanco con \ N de esta manera:
fuente
Fields enclosed by: "
es que"\N"
de"name",\N,"stuff"
\N
se acepta ningún estilo de denotarNULL
. En su lugarNULL
, use , como en este ejemplo:"name","age",NULL,"other","stuff"
El comportamiento es diferente según la configuración de la base de datos. En el modo estricto, esto arrojaría un error o una advertencia. La siguiente consulta puede usarse para identificar la configuración de la base de datos.
fuente
Preprocese su entrada CSV para reemplazar las entradas en blanco con \ N.
Intento de una expresión regular: s / ,, /, \ n, / gy s /, $ /, \ N / g
Buena suerte.
fuente
(variable1, @ variable2, ..) SET variable2 = nullif (@ variable2, '' o '') >> puede poner cualquier condición
fuente
mostrar variables
Show variables like "`secure_file_priv`";
Nota: mantenga su archivo csv en la ubicación dada por el comando anterior.
Nota: aquí la
date
columna ' ' tiene algunos valores en blanco en el archivo csv.fuente