Es gibt ein RIESIGES Problem mit den Angaben, die Sie für die Daten angegeben haben. Wenn "|"
eine gültige Zeichenfolge ist, oder genauer gesagt, wird eine Zeichenkette in Anführungszeichen erlaubt mit einem Rohr zu starten, dann, wenn eine Zeichenfolge mit einem fehlenden Zitat Ende, zum Beispiel "Account1
, hat als erstes folgendes einer zitierte Feld, das mit einem Rohr beginnt, zum Beispiel "|Mary"
, dann Es gibt keine Möglichkeit, in allen Fällen festzustellen, ob das "|
Endquot |"Account1||||||||||||"|
oder das Startquot für ist |"|Mary"|
.
Verwenden Sie zum Beispiel eine (aus Gründen der Lesbarkeit) gekürzte, leicht modifizierte Version der Daten, bei der alle zitierten Zeichenfolgen ab dem zweiten Punkt mit einer Pipe beginnen und die Endanführungszeichen fehlen
123|110092|ACCT|"HC Account"|"Account1||||||||||||"|Mary|||"|||||132|"|STE|504|1253
Es ist ersichtlich, dass dies falsch interpretiert wird
123
110092
ACCT
"HC Account"
"Account1||||||||||||"
Mary
"|||||132|"
STE
504
1253
Beachten Sie, dass dies ein Problem ist, wenn Sie Regex, Python oder eine andere Sprache verwenden. Das allgemeine Fallproblem kann "gelöst" werden, aber es wird kompliziert sein und erfordert Kenntnisse über die Anzahl der Felder pro Zeile und die Datenstruktur dieser Felder. (Und es kann immer Randfälle geben, für die nicht gesorgt wird.)
Eine Regex-Lösung, die zumindest die meisten Fälle eines öffnenden doppelten Anführungszeichens erkennt, erfordert jedoch einen Ansatz mit mehreren Durchgängen, da der reguläre Ausdruck den gesamten Text vom Beginn jeder Zeile bis zur ersten unverarbeiteten, unverarbeiteten Öffnung erfassen muss Zitat. (Andernfalls werden, wie Ihr Regex zeigt, selbst in den einfachsten Fällen falsch positive Ergebnisse gefunden.)
Die erforderliche Anzahl von Durchläufen ist die maximale Anzahl von Feldern, die nur in Anführungszeichen eingeschlossen sind, für eine Zeile in der gesamten Datei, plus eins. Das Beenden der Verarbeitung jeder Datei erfordert das Erkennen, wann der Regex keine weiteren Änderungen an der Datei vornimmt.
Dies ist der einfachste reguläre Ausdruck, der in den meisten Fällen funktionieren wird:
Capturing Group 1 Capturing Group 2 (All previous valid fields) (Unclosed opening quote) __________________________|_________________________ | | || | ^((?:(?:(?!")[^|\r\n]*|"[^"\r\n]*"(?=$|\|))(?:$|\|))*+)(") |____________| |_________________| |______| | | | Unquoted field OR Quoted field EOL or hypen delimiter
Verwenden Sie es mit dieser Ersatzzeichenfolge:
$1\\$2
Wenn der Ersetzungsstring die Anführungszeichen nur zum Öffnen freigibt, so dass das erste Zeichen des verarbeiteten Feldes nicht mehr ein Zitat ist, überspringt der Regex das Feld in nachfolgenden Durchläufen.
Beachten Sie, dass dieser reguläre Ausdruck leider nur in Anführungszeichen angegebene Felder ignoriert, wenn das folgende Feld in Anführungszeichen mit einer Pipe beginnt. Wenn außerdem das nächste angezeigte Feld mit einer Pipe endet, wird auch ein falsches Positiv für ein weiteres nachfolgendes Anführungszeichen generiert.
Als Nebeneffekt der Einfachheit ignoriert der Regex auch Anführungszeichen, die in der Mitte eines Feldes erscheinen. (Dies kann ein Problem sein oder nicht.)
Der Regex kann so verbessert werden, dass er auch dann funktioniert, wenn das nächste folgende Feld mit einer Pipe beginnt:
^((?:(?:(?!")[^|\r\n]*|"[^"\r\n]*"(?:(?=$)|(?=\|)(?!(?:\|[^|"\r\n]*)+[^|\r\n]")))(?:$|\|))*+)(") |____________________________________________| | Modified lookahead to make sure that the following | is not the first char of a properly quoted field
Es ist jedoch nicht möglich, das Problem so zu korrigieren, dass es für den Fall funktioniert, in dem das nächste angeführte Feld mit einer Pipe beginnt und endet.