Skip site navigation (1) Skip section navigation (2)

Copier de données depuis un fichier csv vers plusieurs tables

From: Denis Bitouzé <dbitouze(at)wanadoo(dot)fr>
To: pgsql-fr-generale(at)postgresql(dot)org
Subject: Copier de données depuis un fichier csv vers plusieurs tables
Date: 2011-12-02 14:22:11
Message-ID: 20111202152211.2bc8212d@wanadoo.fr (view raw or flat)
Thread:
Lists: pgsql-fr-generale
Bonjour,

la question que je me pose est peut-être un FAQ mais je ne parviens pas
à trouver de réponse.

Schématiquement, je souhaite à partir d'un fichier .csv, d'une pierre
deux coups :

  1. ajouter, au moyen de la commande COPY, des données à une table T1 ;

  2. remplir une table de jointure T3 entre T1 et une table T2 pour
  indiquer à quel élément de T2 sont liées les données qui
  viennent d'être ajoutées à T1.

Pour fixer les idées, mon cas d'utilisation est le suivant : je dispose
de 3 tables :

  1. « etudiants » contenant différents étudiants, chacun caractérisé
  par ses nom et prénom :

select * from etudiants where 0=1;
 id_etu | nom_etu | prenom_etu 
--------+---------+------------

  2. « promotions » contenant les différentes promotions auxquelles les
  étudiants appartiennent ou ont appartenu (caractéristiques sans
  intérêt ici) :

select id_promotion from promotions where 0=1;
 id_promotion 
--------------

  3. une table de jointure « etudiants_promotions » entre les 2 tables
  précédentes pour indiquer à quelle(s) promotion(s) un étudiant donné
  appartient ou a appartenu :

select * from etudiants_promotions where 0=1;
 id_etu_promo | id_etu | id_promotion 
--------------+--------+--------------

Pour faciliter l'inscription des étudiants (d'une promotion donnée) dans
la table « etudiants », je dispose d'un fichier etudiants.csv contenant
schématiquement :

nom_etudiant_1,prenom_etudiant_1
nom_etudiant_2,prenom_etudiant_2
nom_etudiant_3,prenom_etudiant_3
nom_etudiant_4,prenom_etudiant_4
nom_etudiant_5,prenom_etudiant_5

que je compte utiliser ainsi :

COPY etudiants(nom,prenom) FROM '/home/bitouze/etudiants.csv' WITH
DELIMITER ',';

Le problème est que, sachant que les étudiants en question vont
appartenir à une promotion donnée (disons id_promotion = 42), j'aurais
aimé également pouvoir faire d'une pierre deux coups en remplissant en
même temps la table de jointure « etudiants_promotions ».

Bien sûr, je pourrais a posteriori faire quelque chose du genre :

INSERT INTO etudiants_promotions (id_etu,id_promotion) SELECT
id_etudiant,42 from etudiants where
nom_etu = nom_etudiant_1 AND prenom_etu = prenom_etudiant_1

et ainsi de suite pour chacun des étudiants mais :

  1. c'est lourd ;

  2. c'est surtout bogogène en cas d'homonymie.

Auriez-vous une idée pour gérer efficacement ce genre de situation ?

Merci d'avance.
-- 
Denis

Responses

pgsql-fr-generale by date

Next:From: Cédric VillemainDate: 2011-12-02 14:38:01
Subject: Re: [pgsql-fr-generale] Copier de données depuis un?==?ISO-8859-1?Q? fichier csv vers plusieurs tables
Previous:From: Dimitri FontaineDate: 2011-12-02 14:03:34
Subject: Re: Rencontre parisienne d'hier soir

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group