Vous n'êtes pas identifié(e).
Pages : 1
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
Merci, ça marche.
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
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
Pages : 1