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 21/06/2012 21:47:26

MitsuTomoe
Membre

Insertion line feed dans un champ

Bonjour,
je voudrais mettre à jour un champ avec des retour chariot/nouvelle ligne.
J'ai essayé plusieurs syntaxes sans succès .
Mon dernier essai :
fictmp := '<?xml version="1.0" encoding="UTF-8"?>'||E'\r\n'||'<biens>'||E'\r\n';

Rien n'y fait, il me met la chaine \r\n dans le champ au lieu de l'interpréter.
Question de débutant, je suppose, mais qui aurait la solution ?

Merci d'avance pour votre aide

Hors ligne

#2 21/06/2012 22:05:29

MitsuTomoe
Membre

Re : Insertion line feed dans un champ

J'ai oublié de préciser que je suis en PostgreSQL 9.1.4 sous Ubuntu server 12.04 .

Hors ligne

#3 21/06/2012 23:38:41

rjuju
Administrateur

Re : Insertion line feed dans un champ

Bonsoir,
dans quelle langage programmez vous ?
Personnellement en postgresql 9.1.4 avec pgAdmin faire un select E'a\r\nz' me renvoie bien le retour chariot. Vérifiez que votre type de donnée pour la variable fictmp peut bien stocker ce genre de caractère, vérifiez sinon avec psql ou pgAdmin que cela ne vient pas de votre configuration serveur.
A noter également que la fin de ligne \r\n est le format windows, sous linux il ne faut mettre qu'un \n.

Hors ligne

#4 22/06/2012 00:02:52

MitsuTomoe
Membre

Re : Insertion line feed dans un champ

En pl/PgSQL. C'est bien le bon forum ?

Hors ligne

#5 22/06/2012 00:25:21

MitsuTomoe
Membre

Re : Insertion line feed dans un champ

J'ai remplacé les \r\n par des \n . Maintenant , l'affichage est bon dans psql, mais quand je fais :
copy (select fichier_contenu from diffusion_envoi) to '/users/alex/public/tst.xml';

Le champ fichier_contenu contient toujours des chaines \n et pas de line feed .

Dernière modification par MitsuTomoe (22/06/2012 00:25:53)

Hors ligne

#6 23/06/2012 18:24:47

MitsuTomoe
Membre

Re : Insertion line feed dans un champ

Personne n'a une piste ? Dans le pire des cas, je ferai un sed, awk ou qq chose comme ça mais il y a sûrement moyen de mettre des lf dans un champ ???????

Hors ligne

#7 24/06/2012 17:49:31

gleu
Administrateur

Re : Insertion line feed dans un champ

Les codes \r et \n sont correctement interprétés par PostgreSQL. Montrer un code permettrait de tester de notre côté. Sans ça, nous ne pouvons pas vous dire grand-chose de plus.


Guillaume.

Hors ligne

#8 24/06/2012 20:25:57

MitsuTomoe
Membre

Re : Insertion line feed dans un champ

La fonction complète fait plus de 500 lignes. Le principe : extraction d'une base pg pour au final créer un fichier xml .
Mon approche : une fonction pl/PgSQL qui crée un enregistrement dans une table + un script crontab qui va extraire tous les jours ce qui n'a pas été traité pour créer le fichier.
La table :

CREATE TABLE diffusion_envoi (
    id_envoi integer NOT NULL,
    id_diffusion integer NOT NULL,
    id_agence integer NOT NULL,
    dat_enreg timestamp without time zone NOT NULL,
    dat_envoi timestamp without time zone NOT NULL,
    nb_annonce integer NOT NULL,
    fichier_nom character varying(255) NOT NULL,
    fichier_contenu text NOT NULL,
    dat_creat timestamp without time zone,
    dat_tran timestamp without time zone,
    user_db_creat character varying(40),
    user_db_tran character varying(40),
    user_intranet_creat character varying(40),
    user_intranet_tran character varying(40)
);

Extraits choisis du code :
fictmp varchar;
...
fictmp := '<?xml version="1.0" encoding="UTF-8"?>'|| E'\n';
fictmp := fictmp||'<biens>'|| E'\n';
...

footer := '</biens>'|| E'\n';
    fictmp := fictmp||footer;
    fichier := fictmp;
...
INSERT INTO diffusion_envoi VALUES(default,p_diffuseur,p_agence,now(),null,totdiff,vnomfic,fichier)  RETURNING currval('diffusion_envoi_id_envoi_seq') into videnvoi;

Tout se passe bien, un select me montre fichier_contenu bien présenté.
Ensuite , je fais dans psql : COPY (select fichier_contenu from diffusion_envoi where ....) to '/bidule/machin/tst.xml';
Le fichier obtenu contient des chaînes \n et non pas des line feed ou retour chariot.
Voila, je fais certainement une erreur grossière quelque part ?

Hors ligne

#9 24/06/2012 22:42:19

MitsuTomoe
Membre

Re : Insertion line feed dans un champ

J'ai aussi fait un essai en mettant chr(10) et/ou chr(13) dans le champ sans plus de succès.

Hors ligne

#10 24/06/2012 23:05:56

gleu
Administrateur

Re : Insertion line feed dans un champ

Oui, c'est normal. Dans le contenu d'un COPY, vous avez une ligne du fichier par ligne de la table. Donc les retours chariots sont codés avec des \n. Rien que du normal.


Guillaume.

Hors ligne

#11 24/06/2012 23:06:55

gleu
Administrateur

Re : Insertion line feed dans un champ

Je tiens à préciser... "Dans le contenu d'un COPY par défaut...". Vous n'aurez pas le même comportement avec un COPY au format CSV.


Guillaume.

Hors ligne

#12 24/06/2012 23:25:16

MitsuTomoe
Membre

Re : Insertion line feed dans un champ

Vous avez bien compris que je veux juste extraire un champ texte d'une seule ligne de la table dans un fichier ?

Hors ligne

#13 24/06/2012 23:38:40

MitsuTomoe
Membre

Re : Insertion line feed dans un champ

Edit : j'avais lu et répondu trop vite . Ca marche en lui faisant croire que c'est du csv !
Je vous remercie beaucoup pour votre aide, je n'aurais jamais pensé à ça .
P.S. : comment mettre le fil résolu ?

Hors ligne

#14 25/06/2012 00:35:29

gleu
Administrateur

Re : Insertion line feed dans un champ

Il n'y a pas moyen de le passer en résolu et ça n'est pas dérangeant en fait.


Guillaume.

Hors ligne

Pied de page des forums