Vous n'êtes pas identifié(e).
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
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
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
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