PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 05/05/2010 11:54:45

saigamp
Membre

COPY FROM avec nombre de colonnes variable

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

#2 05/05/2010 12:16:57

gleu
Administrateur

Re : COPY FROM avec nombre de colonnes variable

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

#3 05/05/2010 12:18:53

gleu
Administrateur

Re : COPY FROM avec nombre de colonnes variable

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

#4 05/05/2010 13:38:51

Marc Cousin
Membre

Re : COPY FROM avec nombre de colonnes variable

Encore plus simple : utiliser un filtre pour reformater le fichier et qu'il ait 4 colonnes smile
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

#5 05/05/2010 13:58:33

saigamp
Membre

Re : COPY FROM avec nombre de colonnes variable

gleu a écrit :

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.

gleu a écrit :

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

#6 05/05/2010 14:20:31

gleu
Administrateur

Re : COPY FROM avec nombre de colonnes variable

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

#7 06/05/2010 17:26:06

saigamp
Membre

Re : COPY FROM avec nombre de colonnes variable

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

#8 06/05/2010 19:28:43

Marc Cousin
Membre

Re : COPY FROM avec nombre de colonnes variable

La solution avec un filtre perl ne convient pas ?


Marc.

Hors ligne

Pied de page des forums