Einlesen und verarbieten von Files

Hallo Postgres

wir prüfen momentan eine mögliche MIgration von Ora… nach Postgres

dazu gehören auch FIle Verarbeitungen - Einlesen von FIles und diese dann auf Value und Formatierungen prüfen

In Oracle haben wir da einfach mit SQL Loader ein recht mächtiges und perfomantes Tool gehabt.

Sowas ähnliches gibt es ja auch im Postgres mit

\

  1. Möglichkeit

COPY (halt nicht so mächtig)

  1. Möglichkeit

Nun gibt es ja auch die Möglichkeit über Prozedur ein File einzulesen und dann zu verarbeiten

zb mit

select lo_import(p_path) into l_oid;
oder
pg_read_file(p_path, 0, 10000000);



Leider haben alle 3 Möglichkeiten die gleichen Schwierigkeiten

SQL Error: ERROR: invalid byte sequence for encoding “UTF8”: 0xfc


die Files liegen gemäss linux tool “file” im non-ascii… format vor (die db im utf8)

gibt es Möglichkeiten mit pl/pgsql zuerst das encoding zu überpüfen oder dass es halt die daten auch trotz falschem encoding in die DB schreiben kann oder muss ich wirklich zuerst alle mit einem iconv utility konvertieren?

die File von kommen x Lieferanten und da wird es schwierig alle im Richtigen Encoding zu erhalten

Besten Dank
Martin

Mit pl/pgsql gar nicht, das kann nicht auf Dateien im Filesystem zugreifen. Du könntest aber mit einer untrusted Language, z.B. pl/perlU oder pl/sh arbeiten.

Besser wäre es vermutlich, diese Dinge außerhalb der DB zu machen.

Besten Dank für die schnelle Antwort

klar ist es wohl schlecht ein File in einem x beliebigen encoding in die DB zu laden --> die Zeichen werden ja dann falsch abgespeichert aber dass es gleich eine solche Fehlermeldung gibt erstaunt mich ein wenig. der Oracle Sqlldr hat diese Files halt dann geladen in flaschen encoding. Ich denke ich kann ich davon aussgehen, dass die Files immer im richtigen encoding dahher kommen. (zumal ich ja dann auch mit iconv wissne muss welches encoding diese Files haben und mit dem utility “file” kann man auch nicht zuverlässig sagen um welches encoding es sich handelt)

mit pl/perlU könnte man das encoding zuverlässiger rausfinden? und auch gleich convertieren in anderes encoding?

Nein, um das rauszufinden brauchst Du Tools wie file, iconv und co. Nur mit untrusted Languages kannst Du auf das Filesystem zugreifen und auch externe Programm, wie eben file oder iconv, aufrufen.

Noch mal: es ist keine gute Idee, von einer DB aus im Filesystem rumzupfuschen oder externe Programme aufzurufen. Wenn Dir eine Dateibearbeitung scheitert, kannst Du kein Rollback machen. Wenn Du innerhalb einer Transaktion von der DB aus z.B. eine eMail verschickst, wird ein Rollback der Transaktion die Mail NICHT zurückholen.

Übrigens: ich arbeite bei einem Hoster. Auf einem durch uns gemanagtem System bekommst Du NICHT die Rechte, aus der DB heraus im Filesystem rumzupfuschen. Mittels pl/perlU z.B. arbeitest Du als der DB-Superuser ‘postgres’, damit könntest Du ALLES an Sicherheit, was die DB bietet, unterwandern. Daher: nö.

Denk drüber nach!

Mache den Kram AUßERHALB der DB, und laß die DB das machen, was sie gut kann: konsistente DB-Arbeit.