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 25/02/2024 15:24:24

Alain V.
Membre

[Résolu] Migration MS Access vers Postgresql - Caractères CR/LF

Bonjour le forum,


Dans la base de données MS Access :
J'ai une colonne dont certaines cellules contiennent plusieurs lignes. Ces lignes sont distinctes entre elles car elles se terminent par des CR/LF.
Le type de données de cette colonne est "Mémo". Il contient des adresses.
Voici un exemple du contenu de deux tuples dont la colonne [adresse] me pose problème :

[id][adresse]
1   boulevard du Brouillard{CR LF}
    75001{CR LF}
    Paris
2   impasse des Grenouilles{CR LF}
    33102{CR LF}
    Pétaouchnock

Dans Postgresql :
Voici la table dans laquelle je veux importer les données :

CREATE TABLE adresses (
id SERIAL UNIQUE NOT NULL,
adresse CHARACTER VARYING(30)
);

A l'import, cela se passe mal.
Motif : les CR/LF perturbent la structure du fichier d'import : 1 tuple = 1 ligne terminée par CRLF. Cette structure n'est plus respectée.
Voici le fichier d'import :

COPY adresses(id, adresse) FROM stdin;{CR LF}
1{TAB}boulevard du Brouillard{CR LF}
75001{CR LF}
Paris{CR LF}
2{TAB}impasse des Grenouilles{CR LF}
33102{CR LF}
Pétaouchnock{CR LF}
\.{CR LF}

Pour préserver la lisibilité de mon message, j'ai changé les codes hexa non imprimables par des CR, LF et TAB


Dans Postgresql, je veux conserver ces CR/LF pour réutiliser ce formatage dans d'autres usages.
Si je remplace ces CR LF perturbants par des TAB et que je modifie la table en conséquence alors je peux procéder à l'import mais je perd le formatage. Ce que je ne veux pas.
Il s'agit de plusieurs milliers de tuples à migrer.
Est-ce possible? Comment?


Merci beaucoup par avance pour toutes suggestions.

Dernière modification par Alain V. (25/02/2024 19:02:06)

Hors ligne

#2 25/02/2024 15:55:00

Marc Cousin
Membre

Re : [Résolu] Migration MS Access vers Postgresql - Caractères CR/LF

Bonjour,
Puisque c'est pour injecter dans un COPY, le plus simple, c'est de remplacer CR par \r et LF par \n. cf paragraphe "Text Format" dans https://www.postgresql.org/docs/current/sql-copy.html


Marc.

Hors ligne

#3 25/02/2024 18:51:55

Alain V.
Membre

Re : [Résolu] Migration MS Access vers Postgresql - Caractères CR/LF

Pourquoi n'y avais-je pas pensé!


C'est exactement ce que je souhaitais faire : réaliser l'import en conservant les différentes lignes.

COPY adresses_t(id, adresse) FROM stdin;
1{TAB}boulevard du Brouillard\r\n75001\r\nParis (avec les \\r\\n)
2{TAB}impasse des Grenouilles\n33102\nPétaouchnock (avec le \\n seulement)
\.

Je ne m'attendais pas à ce que le codes \r soit présent dans les cellules. Je ne m'attendais pas non plus à l'ajout d'espaces et des "+" en fin de ligne.
En omettant le "retour chariot" et ne conservant que le 'nouvelle ligne' cela me convient tout à fait.

SELECT * FROM adresses;
 id |             adresse              
----+----------------------------------
  1 | boulevard du Brouillard\r       +
    | 75001\r                         +
    | Paris (avec les \r\n)
  2 | impasse des Grenouilles         +
    | 33102                           +
    | Pétaouchnock (avec le \n seulement)
(2 lignes)

Merci beaucoup aussi pour le lien vers l'usage de COPY. Sa relecture n'a pas été superflue.

Hors ligne

#4 25/02/2024 19:50:37

Marc Cousin
Membre

Re : [Résolu] Migration MS Access vers Postgresql - Caractères CR/LF

Les + et espaces ne sont que de la mise en page de psql (vous devez être dans le mode étendu). Ils ne sont pas en base.

Sinon si c'est pour copier d'une base access vers postgres, vous pouvez aussi demander à access de vous produire un CSV. COPY peut importer le format CSV directement, et vous serez sûr de garder vos caractères supplémentaires


Marc.

Hors ligne

Pied de page des forums