Wie entferne ich Wagenrückläufe und neue Zeilen in Postgresql?

70

Alle,

Ich stecke wieder fest und versuche, meine Daten in einem Format abzurufen, in dem ich sie benötige. Ich habe ein Textfeld, das so aussieht.

"Deangelo 001 Deangelo

lokale Herkunft des Namens: italain

vom amerikanischen Namen Deangelo

Bedeutung: der Engel

emotionales Spektrum • Er ist eine Quelle der Freude für alle.

persönliche Integrität • Sein guter Name ist sein wertvollstes Gut. Persönlichkeit • Es ist schwer, mit Adlern zu fliegen, wenn Sie von Truthähnen umgeben sind! Beziehungen • beginnen langsam, aber mit der Zeit baut sich eine Beziehung zu Deangelo auf. Reisen & Freizeit • Eine Reise seines Lebens liegt in seiner Zukunft.

Karriere & Geld • Als begabtes Kind muss Deangelo ständig herausgefordert werden.

Lebensmöglichkeiten • Freude und Glück erwarten diese gesegnete Person.

Deangelos Glückszahlen: 12 • 38 • 18 • 34 • 29 • 16

""

Was wäre der beste Weg in Postgresql, um die Wagenrückläufe und neuen Zeilen zu entfernen? Ich habe verschiedene Dinge ausprobiert und keiner von ihnen möchte sich verhalten.

select regexp_replace(field, E'\r\c', '  ', 'g') from mytable
    WHERE id = 5520805582

SELECT regexp_replace(field, E'[^\(\)\&\/,;\*\:.\>\<[:space:]a-zA-Z0-9-]', ' ')
    FROM mytable
    WHERE field~ E'[^\(\)\&\/,;\*\:.\<\>[:space:]a-zA-Z0-9-]'
    AND id = 5520805582;

Vielen Dank im Voraus, Adam

aeupinhere
quelle

Antworten:

168
select regexp_replace(field, E'[\\n\\r]+', ' ', 'g' )

Lesen Sie das Handbuch http://www.postgresql.org/docs/current/static/functions-matching.html

Valgog
quelle
25
Sie können die doppelten Schrägstriche entfernen, wenn Sie das EPräfix fallen lassen : '[\n\r]+'. Viel sauberer aussehend, imo.
jpmc26
Die verknüpfte Dokumentation enthält den folgenden Text: `` `Der Parameter flags ist eine optionale Textzeichenfolge, die null oder mehr Einzelbuchstabenflags enthält, die das Verhalten der Funktion ändern. Flag i gibt die Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung an, während Flag g die Ersetzung jeder übereinstimmenden Teilzeichenfolge und nicht nur der ersten angibt. Unterstützte Flags (jedoch nicht g) sind in Tabelle 9-20 beschrieben. `` `
Valgog
4
@Jens wie bei anderen Regex-Motoren 'g'ermöglicht hier ein vollständiger Austausch. Ohne sie werden Ersetzungen nur einmal pro "Zeile" durchgeführt, was in diesem Fall so ziemlich nur "nur einmal" bedeutet, da Postgres \ns nicht als Zeilenumbruch zählt.
Selten 'Wo ist Monica' bedürftig
35
select regexp_replace(field, E'[\\n\\r\\u2028]+', ' ', 'g' )

Ich hatte das gleiche Problem in meinem Postgres d / b, aber die fragliche Newline war nicht die traditionelle ASCII-CRLF, sondern ein Unicode-Zeilentrennzeichen, Zeichen U2028. Das obige Code-Snippet erfasst auch diese Unicode-Variation.

Update ... obwohl ich bisher nur auf die oben genannten Zeichen "in the wild" gestoßen bin , verwenden Sie Folgendes, um den Ratschlägen von lmichelbacher zu folgen, noch mehr Unicode-Zeilenumbrüche zu übersetzen :

select regexp_replace(field, E'[\\n\\r\\f\\u000B\\u0085\\u2028\\u2029]+', ' ', 'g' )
pbnelson
quelle
1
Möglicherweise möchten Sie diesem regulären Ausdruck weitere "newline-y" -Unicode-Zeichen hinzufügen: en.wikipedia.org/wiki/Newline#Unicode
malana
22

OP fragte speziell nach regulären Ausdrücken, da es den Anschein hat, dass es eine Reihe anderer Zeichen und Zeilenumbrüche gibt, aber für diejenigen, die nur Zeilenumbrüche entfernen möchten, müssen Sie nicht einmal zu einem regulären Ausdruck gehen. Sie können einfach tun:

select replace(field,E'\n','');

Ich denke, dies ist ein SQL-Standardverhalten, daher sollte es sich auf alle außer vielleicht den frühesten Versionen von Postgres erstrecken. Das obige wurde für mich in 9.4 und 9.2 gut getestet

Selten "Wo ist Monica" bedürftig
quelle
1
Ich möchte alle daran erinnern, dass replacedie exakte Übereinstimmung des zweiten Parameters ersetzt wird, nicht jedes Zeichen davon.
Experte
11

Wenn Sie Zeilenumbrüche am Anfang oder Ende der Zeichenfolge entfernen müssen, können Sie Folgendes verwenden:

UPDATE table 
SET field = regexp_replace(field, E'(^[\\n\\r]+)|([\\n\\r]+$)', '', 'g' );

Denken Sie daran, dass der Hut ^den Anfang der Zeichenfolge und das Dollarzeichen $das Ende der Zeichenfolge bedeutet.

Hoffe es hilft jemandem.

Bernhar
quelle