web-dev-qa-db-fra.com

Erreur MySQL lors de l'importation de CSV avec des champs vides

J'ai un fichier CSV avec une table exportée, qui a des lignes avec des champs qui ne contiennent pas de valeurs. Les colonnes sont séparées à l'aide de "," et si les champs n'ont pas de valeurs, ils ressemblent à cela: , j'ai essayé de charger les données en utilisant le code suivant:

LOAD DATA INFILE "C:/table.csv"
INTO TABLE target_table 
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS

Les colonnes de la table cible (à charger avec les données de ce fichier CSV) peuvent être annulées, mais le serveur renvoie une erreur:

"Incorrect integer value"

Lorsque je mets NULL entre virgules dans un fichier CSV, le serveur ne renvoie aucune erreur. Est-il possible de modifier certains paramètres pour charger la table sans modifier le fichier CSV?

5
R. Nec

Quelque chose comme ça, vérifier chaque valeur pour '' et insérer NULL à la place, peut aider. Modifiez a, b, c, d pour le nom réel et le nombre de lignes sur la table:

$ cat /tmp/test.csv 
test1, test2, test3, test4
,,,
1,2,3,4
,,,

mysql> LOAD DATA INFILE "/tmp/test.csv" INTO TABLE test.test  
          FIELDS TERMINATED BY ','  
          OPTIONALLY ENCLOSED BY '"' 
          LINES TERMINATED BY '\n' 
          IGNORE 1 ROWS 
       (@a, @b, @c, @d) 
       SET a = IF(@a = '', NULL, @a), 
           b = IF(@b = '', NULL, @b), 
           c = IF(@c = '', NULL, @c), 
           d = IF(@d = '', NULL, @d);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 0

mysql> SELECT * FROM test.test;
+------+------+------+------+
| a    | b    | c    | d    |
+------+------+------+------+
| NULL | NULL | NULL | NULL |
|    1 |    2 |    3 |    4 |
| NULL | NULL | NULL | NULL |
+------+------+------+------+
3 rows in set (0.00 sec)

Vérifiez la syntaxe pour LOAD DATA pour plus de détails.

5
jynus

J'avais '|' séparateurs de champ. J'ai ouvert csv dans un bon éditeur comme vim et substitué || avec |\N |. Oui Majuscule N. C'est ce qu'un didacticiel a dit d'utiliser. En vim:
:% s/||/|\\N|/gc

gc est "global" "confirmer".
Dans le mien, il y avait deux champs vides ensemble, c'est-à-dire: |||
Vim ne ferait le premier que pour une raison quelconque. J'ai donc dû faire la commande une deuxième fois qui a eu la seconde.

Ensuite, mysql a chargé le fichier.

0
Howard_L