Ich habe eine CSV-Zeile wie folgt aus:Wie CSV mit Pgloader oder PostgreSQL-Kopie zu analysieren, wenn es ein n (Zeilenumbruch) in Anführungszeichen gibt?
"aaa"|"bbb"|"ccc"|"dddd
eeeee"
Ich möchte diese Daten importieren, mit pgloader (http://pgloader.io/) oder PostgreSQL COPY (https://www.postgresql.org/docs/9.6/static/sql-copy.html). Mein Problem hier ist die Tatsache, dass es gemäß den CSV-Standards möglich ist, einen Zeilenumbruch (\ n) innerhalb eines zitierten Feldwertes zu haben. Aber pgloader und auch der COPY-Befehl behandeln es wie eine brandneue Datenzeile, statt einer Spalte mit Zeilenumbruch im Inneren.
COPY schema.table (
col_aaa,
col_bbb,
col_ccc,
col_ddd
)
FROM 'file.csv' WITH DELIMITER '|' ENCODING 'LATIN1' CSV;
Mein Befehl COPY Mein pgloader Befehl
LOAD CSV
FROM 'file.csv'
INTO postgresql://user:[email protected]:5432/database?schema.table (col_aaa, col_bbb, col_ccc, col_ddd)
WITH
skip header = 0,
fields optionally enclosed by '"',
fields escaped by double-quote,
fields terminated by '|'
SET client_encoding to 'latin1'
BEFORE LOAD DO
$$ TRUNCATE anac.aerodromos_csv RESTART IDENTITY; $$;
Ich habe viel von den PostgreSQL-Dokumenten suchen und auch von Google.
Das einzige, was ich gefunden habe, war das: Parsing CSV file with \n in double quoted fields aber awk ist zu langsam für eine Datei mit mehr als 1 Million Zeilen.
Irgendwelche Hinweise, wie es geht?
Meine Präferenz ist für pgloader, aber ich kann die Verwendung von sed oder perl als Regex-Agent zur Behandlung von Datei in einem Linux-Shell-Skript akzeptieren.
Irgendwelche Hinweise, wie es geht?
Sie haben die Spaltennummern in jeder Zeile zu prüfen, ob es kleiner als die tatsächliche Anzahl der Spalten ist, sollten Sie nächste Zeile zur aktuellen Zeile hinzufügen und erneut prüfen. – AbhiNickz
Sorry @AbhiNickz Ich kann nicht sehen, wie diese Idee das Problem löst. Die Sache ist, dass ich einen zusätzlichen Zeilenumbruch innerhalb der Felddaten habe, und das Hinzufügen eines neuen scheint nicht zu helfen. –
Bitte überprüfen Sie die Antwort, ich füge keine neue Zeile hinzu, ich bin im Grunde verkettet die Zeilen, die wegen ** \ n ** in zwei Zeilen aufgeteilt sind. – AbhiNickz