3 votes

Charger des données à partir d'un fichier texte dans la base de données

Données :

1|\N|"Première\ Ligne"
2|\N|"Deuxième\ Ligne"
3|100|\N

\N représente NULL dans MYSQL & MariaDB. J'essaie de charger les données ci-dessus en utilisant la méthode LOAD DATA LOCAL INFILE dans une table nommée ID_OPR.

Structure de la table :

CREATE TABLE ID_OPR (
  idnt decimal(4),
  age decimal(3),
  commentaire varchar(100)
);

Mon code ressemble à ceci :

LOAD DATA LOCAL INFILE  INTO TABLE  FIELDS TERMINATED BY '|' ESCAPED BY '' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n';

Le problème avec ce code est qu'il s'arrête avec une erreur Incorrect decimal value: '\\N' For column .

Question : Comment charger ces données avec des valeurs NULL dans la deuxième colonne décimale et sans perdre le \(Antislash) de la troisième colonne de chaîne ?

J'essaie ceci dans MariaDB qui est similaire à Mysql dans la plupart des cas.

Mise à jour : L'erreur que j'ai mentionnée semble être un avertissement et les données sont en fait chargées dans la table. Mais le problème réside dans les données textuelles.

Par exemple : Dans le cas du troisième enregistrement ci-dessus, il est chargé tel quel en tant que \N dans la colonne de chaîne. Mais je veux que ce soit NULL.

Y a-t-il un moyen de faire reconnaître cette valeur nulle par le logiciel ? Quelque chose comme decode dans oracle ?

3voto

Unix One Points 936

Vous ne pouvez pas avoir les deux - soit \\ est un caractère d'échappement, soit il ne l'est pas. De MySQL docs:

Si le caractère FIELDS ESCAPED BY est vide, aucun caractère n'est échappé et NULL est affiché en tant que NULL, pas en tant que \N. Il n'est probablement pas une bonne idée de spécifier un caractère d'échappement vide, en particulier si les valeurs des champs de vos données contiennent l'un des caractères de la liste juste donnée.

Je suggère donc un fichier d'entrée au format cohérent, quelle que soit la manière dont il a été généré:

  • utilisez \\ si vous souhaitez conserver le backslash dans les chaînes
  • faire de \ un caractère d'échappement dans votre commande de chargement

Ou

  • faites en sorte que les chaînes soient toujours, et non facultativement, encloses de guillemets
  • laissez le caractère d'échappement vide, tel quel
  • utilisez NULL pour les nulls, pas \N

En passant, cela explique également les avertissements que vous avez rencontrés lors du chargement de \N dans votre champ décimal.

0voto

Deal with nulls with blanks. that should fix it.

1||"First\Line"
2||"Second\Line"
3|100|

Thats how nulls are handled on CSVs and TSVs. And don't expect decimal datatype to go null as it stays 0, use int or bigint instead if needed. You should forget about "ESCAPED BY"; as long as string data is enclosed by "" that deals with the escaping problem.

0voto

Cherif Points 6554

OK changez votre fichier comme ceci :

1|\N|"Première\\Ligne"
2|\N|"Deuxième\\Ligne"
3|100|\N

J'ai travaillé avec votre exemple et cela fonctionne

LOAD DATA INFILE 'D:\d.txt' INTO TABLE ID_OPR FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY ''  ESCAPED BY '\\' LINES TERMINATED BY '\n';

La différence est : ESCAPED BY '\\'

Mon résultat :

mysql>
mysql> LOAD DATA INFILE 'D:\d.txt' INTO TABLE ID_OPR FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY ''  ESCAPED BY '\\' LINES TERMINATED BY '\n';
Query OK, 3 rows affected (0.00 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 0

un select :

mysql> select idnt,age,comment from id_opr;
+------+------+---------------+
| idnt | age  | comment       |
+------+------+---------------+
  |  1 | NULL | "Première\Ligne"
 |   2 | NULL | "Deuxième\Ligne"
|    3 |  100 |         |
+------+------+---------------+
3 rows in set (0.00 sec)

0voto

Nous avons besoin de trois fichiers texte & 1 fichier batch pour charger les données : Supposons que l'emplacement de votre fichier soit 'D:\loaddata' Votre fichier texte 'D:\loaddata\abc.txt'
1. D:\loaddata\abc.bad -- vide
2. D:\loaddata\abc.log -- vide
3. D:\loaddata\abc.ctl
a. Écrire le code ci-dessous pour aucun séparateur

OPTIONS ( SKIP=1, DIRECT=TRUE, ERRORS=10000000, ROWS=5000000) 
load data 
infile 'D:\loaddata\abc.txt' 
TRUNCATE
into table Your_table
(
 a_column          POSITION   (1:7) char,
 b_column          POSITION   (8:10) char,
 c_column          POSITION   (11:12) char,
 d_column          POSITION   (13:13) char,
 f_column          POSITION   (14:20) char
)

b. Écrire le code ci-dessous pour un séparateur de virgule

OPTIONS ( SKIP=1, DIRECT=TRUE, ERRORS=10000000, ROWS=5000000) 
load data 
infile 'D:\loaddata\abc.txt' 
TRUNCATE
into table Your_table
FIELDS TERMINATED BY ","
TRAILING NULLCOLS
(a_column,
 b_column,
 c_column,
 d_column,
 e_column,
 f_column
 )

4.D:\loaddata\abc.bat "Écrire le code ci-dessous"

sqlldr db_user/db_passward@your_tns control=D:\loaddata\abc.ctl log=D:\loaddata\abc.log

Après avoir double-cliqué sur le fichier "D:\loaddata\abc.bat", vos données seront chargées dans la table Oracle souhaitée. Si quelque chose ne va pas, vérifiez les fichiers "D:\loaddata\abc.bad" et "D:\loaddata\abc.log"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X