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 Général » Importer un fichier CSV dans un table Postgresql » 30/11/2015 13:41:00

Jason Chambers
Réponses : 0

Bonjour,

Pour ceux qui cherchent une solution facile pour importer des CSV dans pg.
(Ou un fichier Excel transformé en CSV.)

Voici comment je fais :

DROP TABLE IF EXISTS table_x1 ;  

CREATE TABLE  table_x1 (bigfield TEXT)                     -- avec TEMP si on veut
;
 
copy table_x1 FROM '/home/jasonc/csv_data/data.csv' 
		WITH 
 		delimiter '!' -- ce caractère ne se trouve pas dans le fichier
;
				
DROP TABLE IF EXISTS  table  x_2;  
SELECT 
split_part(bigfield, ';',  1) 		AS id,
split_part(bigfield, ';',  2) 		AS type,
split_part(bigfield, ';',  3)::date  	AS create_date,
split_part(bigfield, ';',  4)::numeric	AS salary
...
into x_2
from x_1
; 
DROP table x_1 -- si on veut.

-- Avantages :
-- c'est plus facile de balancer tous le fichier tout entier dans pg
-- plutôt que de gérer le feedback confusionnant retourné par la commande COPY
-- on peut facilement sélectionner les colonnes a envoyer dans x_2, et ignorer d'autres
----
Autre variante :

DROP TABLE IF EXISTS table_x1 ;  

CREATE TABLE  table_x1 (bigfield TEXT)
;
 
copy table_x1 FROM '/home/jasonc/csv_data/data.csv'
		WITH 
 		delimiter '!' -- ce caractère ne se trouve pas dans le fichier
;
				
ALTER TABLE x_1
ADD COLUMN id text ,
ADD COLUMN  type text 
;

Update x_1
set 
id    = split_part(bigfield, ';',  1) 		,
type= split_part(bigfield, ';',  2) 	
;

Une fois qu'on est certain d'avoir récupéré les colonnes utiles, on pour faire un drop sur la colonne bigfield.

Voilà.
Moi je fais comme ça.

Jason

#3 Général » CTE dans un select query_to_xml() » 25/11/2015 14:56:56

Jason Chambers
Réponses : 2

Bonjour,

J'ai un problème avec un CTE quand je veux l'utilser dans query_to_xml().

Etant donné la table suivante :
--------------------------------------------------------------
CREATE TABLE client (client_id TEXT  ) ;
INSERT INTO  client VALUES('1649') ;
--------------------------------------------------------------
Ceci fonctionne correctement :
WITH myselect   AS
(select         client_id
                from client
                where client_id = '1649'
)
SELECT  * from  myselect
;
---------------------------------------------------------------------
Mais ceci ne fonctionne pas :
WITH myselect   AS
(select         client_id
                from client
                where client_id = '1649'
)
         
select query_to_xml(
'SELECT  * from  myselect' , TRUE, TRUE, ''
)
;

Normal ou pas ?
Ou une faute de frappe quelque part ?

Merci,
jason

#4 Général » Using a network resource for a COPY FROM » 04/11/2015 12:21:31

Jason Chambers
Réponses : 1

Bonjour,
utilisant
Windows Server 2012 R2
Postgresql 9.5 Beta

J'essaie d'importer des données dans plusieurs tables depuis des fichiers CSV sur un autre serveur.
J'ai un fichier BAT qui lance psql avec un fichier de commandes contenant une serie d'instructions de type \i nomdefichier.sql.


Ce syntaxe fonctionne correctement :

Copy matable  from '\\Serveur9\Donnees\mesdonnees.txt'
  WITH CSV
     DELIMITER E'\t'
     QUOTE AS '"'
     NULL AS '' ;

Mais je dois écrire le chemin en dur dans chacun de mes scripts SQL.

Puisque, l'année prochaine,
je sais que je vais changer le serveur qui héberge les données CSV ,
(et que pendant un temps le serveur actuel et le nouveau serveur vont cohabiter,)
je me suis dit qu'il serait plus facile pour moi de créer un network ressource,
et ainsi, le moment venu de switcher les serveurs,
je n'aurais plus que redéfinir ce ressource.


Je fais donc
Nets use S: \\Serveur9\Donnees /persistent:yes
et j'ai un nouveau disque S: qui pointe vers la source de mes données CSV.
Parfait.

Mais le syntaxe

Copy matable  from 'S:\mesdonnees.txt'
  WITH CSV
     DELIMITER E'\t'
     QUOTE AS '"'
     NULL AS '' ;

ne fonctionne pas.

Voici le message d'erreur :
psql:C:/pgstuff/imprt_1.sql:97: ERREUR:  n'a pas pu ouvrir le fichier « S:\mesdonnees.txt » pour une lecture : No such file or directory


Mes questions :
Est-ce que ce fonctionnement est normal ? ( "By design" ?) dans la logique de l'interdiction des chemins relatifs avec COPY ? (Est-ce que un "disque réseau" est réellement relatif ?)
Ou est-ce que j'ai une faute syntaxe dans le style "escaped backslashes" ?
Ou est-ce que c'est un bug du 9.5 Beta ?
Ou encore autre chose ?

Merci d'avance,

Jason

Pied de page des forums

Propulsé par FluxBB