Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
Je tente d'insérer des données d'un fichier texte vers une table grâce à la commande COPY FROM. L'insertion se passe bien lorsque le nombre de colonnes est bien défini.
Mon problème est le suivant:
Ma table "ma_table" a 4 colonnes: col1, col2, col3, col4 de type varchar(255).
Mon fichier texte (séparateur "|") a la particularité d'avoir des lignes où seules les 2 premières colonnes sont renseignées:
val1|val2
val1|val2
val1|val2
val1|val2|val3|val4
val1|val2|val3|val4
A l'exécution de
copy "ma_table" from '/home/user/mon_fichier.txt' using delimiters '|' null as ''
j'obtiens l'erreur:
ERREUR: données manquantes pour la colonne « COL3 »
CONTEXT: COPY ma_table, ligne 1 : « val1|val2 »
Dans la doc officielle, il est précisé "COPY FROM lèvera une erreur si une des lignes du fichier en entrée contient plus ou moins de colonnes qu'attendues."
Je voudrais savoir si quelqu'un a déjà rencontré ce problème ou s'il existe une solution de contournement de cette erreur.
Je ne veux pas créer 2 fichiers, l'un avec les lignes à 2 colonnes et l'autre avec les lignes à 4 colonnes, pour faire ensuite 2 COPY FROM.
Merci
Hors ligne
Je voudrais savoir si quelqu'un a déjà rencontré ce problème ou s'il existe une solution de contournement de cette erreur.
Seul contournement possible, créer deux fichiers.
Je ne veux pas créer 2 fichiers, l'un avec les lignes à 2 colonnes et l'autre avec les lignes à 4 colonnes, pour faire ensuite 2 COPY FROM.
Dommage pour vous.
Vous pouvez essayer aussi pgloader. Peut-être qu'il gère ce cas directement. Mais ça vous fait appeler un outil supplémentaire en ligne de commande.
Guillaume.
Hors ligne
Maintenant que je viens d'appuyer sur Envoyer, une autre solution me vient en tête. Créez une table temporaire avec seulement une colonne. Insérez le contenu de votre fichier dans cette table. Insérez les données de la table en extrayant chaque partie vous intéressant. Plus complexe à mettre en place qu'un bête COPY, mais ne nécessite pas d'outils supplémentaires.
Guillaume.
Hors ligne
Encore plus simple : utiliser un filtre pour reformater le fichier et qu'il ait 4 colonnes
En perl par exemple :
perl -ne 'if (/^.*\|.*\|.*\|.*$/) {print} else {chomp;print;print "||\n"}'
Bon évidemment, c'est plus simple si on maîtrise les expressions régulières. Mais ça reformate le fichier à la volée dans le cas que vous évoquez.
Marc.
Hors ligne
Créez une table temporaire avec seulement une colonne. Insérez le contenu de votre fichier dans cette table. Insérez les données de la table en extrayant chaque partie vous intéressant. Plus complexe à mettre en place qu'un bête COPY, mais ne nécessite pas d'outils supplémentaires.
Le problème c'est que sur des grosses tables le temps de traitement va être long. Je voulais profiter du COPY FROM pour éviter le ligne à ligne.
Vous pouvez essayer aussi pgloader.
Je vais tester cette solution basé sur COPY FROM.
Sinon je créerai 2 fichiers, tant pis. Ou le reformatage du fichier pour ne faire qu'un COPY FROM.
Merci pour ces réponses!
Dernière modification par saigamp (05/05/2010 13:59:11)
Hors ligne
Le problème c'est que sur des grosses tables le temps de traitement va être long. Je voulais profiter du COPY FROM pour éviter le ligne à ligne.
Ma proposition parle uniquement de COPY. Elle utilise INSERT pour la deuxième partie mais ce sera extrêmement rapide.
Guillaume.
Hors ligne
Je n'ai pas trouvé mon bonheur avec pgloader (ne veut pas dire qu'il n'y est pas!).
Je vais donc faire 2 fichiers.
Hors ligne
La solution avec un filtre perl ne convient pas ?
Marc.
Hors ligne
Pages : 1