J'ai un fichier qui peut contenir de 3 à 4 colonnes de valeurs numériques séparées par des virgules. Les champs vides sont définis à l'exception lorsqu'ils se trouvent à la fin de la ligne:
1,2,3,4,5
1,2,3,,5
1,2,3
Le tableau suivant a été créé dans MySQL:
+ ------- + -------- + ------ + ----- + --------- + ------- + | Champ | Type | Null | Clé | Par défaut | Extra | + ------- + -------- + ------ + ----- + --------- + ------- + | un | int (1) | OUI | | NULL | | | deux | int (1) | OUI | | NULL | | | trois | int (1) | OUI | | NULL | | | quatre | int (1) | OUI | | NULL | | | cinq | int (1) | OUI | | NULL | | + ------- + -------- + ------ + ----- + --------- + ------- +
J'essaie de charger les données à l'aide de la commande MySQL LOAD:
LOAD DATA INFILE '/tmp/testdata.txt' INTO TABLE moo FIELDS
TERMINATED BY "," LINES TERMINATED BY "\n";
Le tableau résultant:
+ ------ + ------ + ------- + ------ + ------ + | un | deux | trois | quatre | cinq | + ------ + ------ + ------- + ------ + ------ + | 1 | 2 | 3 | 4 | 5 | | 1 | 2 | 3 | 0 | 5 | | 1 | 2 | 3 | NULL | NULL | + ------ + ------ + ------- + ------ + ------ +
Le problème réside dans le fait que lorsqu'un champ est vide dans les données brutes et n'est pas défini, MySQL pour une raison quelconque n'utilise pas la valeur par défaut des colonnes (qui est NULL) et utilise zéro. NULL est utilisé correctement lorsque le champ est totalement absent.
Malheureusement, je dois être capable de faire la distinction entre NULL et 0 à ce stade, donc toute aide serait appréciée.
Merci S.
Éditer
La sortie de SHOW WARNINGS:
+ --------- + ------ + -------------------------------- ------------------------ + | Niveau | Code | Message | + --------- + ------ + -------------------------------- ------------------------ + | Avertissement | 1366 | Valeur entière incorrecte: «» pour la colonne «quatre» à la ligne 2 | | Avertissement | 1261 | La ligne 3 ne contient pas de données pour toutes les colonnes | | Avertissement | 1261 | La ligne 3 ne contient pas de données pour toutes les colonnes | + --------- + ------ + -------------------------------- ------------------------ +
la source
LOAD DATA
. Voir la section des exemples SQL de d6tstack sur les changements de schéma de données.Réponses:
Cela fera ce que vous voulez. Il lit le quatrième champ dans une variable locale, puis définit la valeur réelle du champ sur NULL, si la variable locale finit par contenir une chaîne vide:
S'ils sont tous éventuellement vides, vous les liriez tous dans des variables et auriez plusieurs instructions SET, comme ceci:
la source
''
lorsqu'ils téléchargent un csv (en utilisantIFNULL(Col,'')
dans laSELECT INTO OUTFILE
requête) pour Excel, mais les téléchargements les acceptent ensuite comme null plutôt que d'avoir à traiter\N
dans le csv. Merci!0
qui doivent être convertisNULL
(car il n'est pas possible d'avoir une valeur zéro pour les données en question) et également des chaînes vides. Comment s'assurer que les zéros et les chaînes vides sont convertis enNULL
?nullif(@vone, 0)
.Le manuel MySQL dit:
Vous devez donc remplacer les blancs par \ N comme ceci:
la source
Fields enclosed by: "
c'est celui"\N"
de"name",\N,"stuff"
\N
n'est accepté comme dénotantNULL
. Utilisez plutôtNULL
, comme dans cet exemple:"name","age",NULL,"other","stuff"
Le comportement est différent selon la configuration de la base de données. En mode strict, cela lèverait une erreur ou un avertissement. La requête suivante peut être utilisée pour identifier la configuration de la base de données.
la source
Prétraitez votre CSV d'entrée pour remplacer les entrées vides par \ N.
Tentative sur une expression régulière: s / ,, /, \ n, / g et s /, $ /, \ N / g
Bonne chance.
la source
(variable1, @ variable2, ..) SET variable2 = nullif (@ variable2, '' ou '') >> vous pouvez mettre n'importe quelle condition
la source
afficher les variables
Show variables like "`secure_file_priv`";
Remarque: conservez votre fichier csv à l'emplacement indiqué par la commande ci-dessus.
Remarque: ici, la
date
colonne « » contient des valeurs vides dans le fichier csv.la source