SQL*Loader: der Umgang mit dem delimiter-Zeichen in Daten
Ich bin laden einige Daten in Oracle über SQLLDR. Die Quell-Datei ist "pipe-delimited".
FIELDS TERMINATED BY '|'
Aber einige Datensätze enthalten, die pipe-Zeichen in Daten, und nicht als Trennzeichen. So bricht es die richtige Beladung der Rekorde als es versteht indata pipe-Zeichen als Feld-terminator.
Können Sie zeigen Sie mir eine Richtung, um dieses Problem zu lösen?
Daten-Datei ist über 9 GB, also ist es schwer zu manuell Bearbeiten.
Beispielsweise
Geladen Zeile:
ABC|1234567|STR 9 R 25/98734959,32/28.12.2011
Abgelehnt Reihe:
DE4|2346543|WIR| 454/956584,84/28.11.2011
Fehler:
Rejected - Error on table HSX, column DATE_N.
ORA-01847: day of month must be between 1 and last day of month
DATE_N Spalte ist die Letzte.
können Sie ein Beispiel setzen der Zeile mit den Problemen?
Sind die Felder mit den Rohren
aktualisiert.
Es wäre einfacher, aber die Felder sind nicht von Anführungszeichen eingeschlossen.
In der Regel, dass das, was die
Sind die Felder mit den Rohren
|
in Anführungszeichen eingeschlossen ? zum Beispiel DATA1|DATA2|"DATAWITH|PIPE"|DATA3
. In diesem Fall können Sie FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"'
aktualisiert.
Es wäre einfacher, aber die Felder sind nicht von Anführungszeichen eingeschlossen.
In der Regel, dass das, was die
OPTIONALLY ENCLOSED BY
- Klausel wird; Datenfelder, zu denen auch die Trennzeichen sind beizufügen, die von verschiedenen Trennzeichen.InformationsquelleAutor bonsvr | 2012-01-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie könnte verwenden Sie keine Trennzeichen, und tun Sie etwas wie:
Diese regexp dauert sechs capture-Gruppen (in Klammern) getrennt durch einen vertikalen Strich (ich hatte, um es zu entkommen, weil es sonst bedeutet, ODER regexp). Alle Fraktionen mit Ausnahme der Dritten enthalten, nicht einen senkrechten Balken (
[^|]*
), die Dritte Gruppe kann alles enthalten (.*
), und der regexp muss die Spanne von Anfang bis Ende der Zeile (^
und$
).Diese Weise sind wir sicher, dass die Dritte Gruppe Essen alle überflüssigen Trennzeichen. Das funktioniert nur, weil du hast nur ein Feld das Trennzeichen enthalten kann. Wenn Sie möchten, proofcheck Sie können beispielsweise angeben, dass die vierte Gruppe beginnt mit einer Ziffer (gehören
\d
zu Beginn des vierten eingeklammerte block).Ich habe verdoppelt alle backslashes, da stehen wir in einer doppelten Anführungszeichen Ausdruck, aber ich bin nicht wirklich sicher, dass ich sollte.
Der FÜLLSTOFF nimmt die ganze Zeile von Daten, und der reguläre Ausdruck spaltet es in seine 6 sinnvolle Teile. Wenn Sie nicht wissen, was ein regulärer Ausdruck ist, Suche den regex-tag hier.
Ok, ich habe es, +1 🙂 . Ich weiß was ein regulärer Ausdruck ist, aber ich habe nie verwendet die Oracle-REGEXP-Funktionen. Es ist so, wie ich mit awk. Sie Tat es mit regexps.
+1 fantastisch. Ich habe es immer geliebt REGEXPs, aber ich bin kein Experte über Sie. Können Sie bitte erklären, ein wenig weiter die regexp-code.
erweiterte Antwort. Beachten Sie, dass ich noch nicht getestet, nichts.
InformationsquelleAutor Benoit
Sieht es für mich aus, dass es nicht wirklich möglich, SQL*Loader, um Ihre Datei, weil das Dritte Feld, das: enthält die Trennzeichen, die nicht von Anführungszeichen umgeben und hat eine variable Länge. Stattdessen, wenn die Daten, die Sie bereitstellen, ist ein genaues Beispiel, dann kann ich eine Probe geben Abhilfe. Erstellen Sie zunächst eine Tabelle mit einer Spalte VARCHAR2 Länge die gleiche wie die maximale Länge einer Zeile in der Datei. Dann laden Sie einfach die gesamte Datei in diese Tabelle. Von dort aus können Sie extrahieren Sie jede Spalte mit einer Abfrage wie:
Es ist nicht perfekt (auch wenn es vielleicht anpassungsfähig sein, um SQL*Loader), sondern brauchen ein bisschen arbeiten, wenn Sie mehr Spalten, oder wenn Ihr das Dritte Feld ist nicht das, was ich denke, es ist. Aber es ist ein Anfang.
InformationsquelleAutor John Doyle
OK, ich empfehle Ihnen das Parsen der Datei und ersetzen Sie das Trennzeichen.
In der Befehlszeile in Unix/linux sollten Sie tun:
Dieser Befehl wird nicht ändern Sie Ihre aktuelle Datei.
Erstellen Sie eine neue Datei, durch Komma getrennt, mit fünf Feldern.
Es spaltet die input-Datei auf "|" und nehmen Sie den ersten, zweiten, etwas antelast, antelast, und letzten chunk.
Können Sie versuchen, sqlldr die new_file "," Trennzeichen.
UPDATE:
Sie können den Befehl in ein Skript ähnlich (und mit der Bezeichnung parse.awk)
und Sie können auf diese Weise:
wow. wie auch immer, wenn Sie einen unix/linux zur hand, kann es schneller sein, korrigieren Sie die Datei in dieser Art 🙂
InformationsquelleAutor Florin Ghita