2016-04-06 8 views
0

Ich muss ein seltsames CSV-Format verarbeiten, und ich habe Probleme bekommen. Die Zeichenfolge ich in der Lage gewesen, so weit zu arbeiten, istWie kann ich Regex verwenden, um irreguläre CSV-Dateien zu parsen und bestimmte Zeichen nicht auszuwählen?

(?:\s*(?:\"([^\"]*)\"|([^,]+))\s*?)+? 

Meine Dateien sind oft gebrochen und unregelmäßig, da wir mit OCR-Text zu tun haben, die in der Regel nicht von unseren Benutzern geprüft. Daher neigen wir dazu, mit vielen seltsamen Dingen zu enden, wie einer einzelnen "innerhalb eines Feldes" oder sogar einem Newline-Charakter (weshalb ich Regex anstelle meiner vorherigen readLine() - basierten Lösung verwende) Es parst fast alles richtig, außer dass es [,] [,] erfasst. Wie kann ich erreichen, dass Felder mit nur einem Komma NICHT ausgewählt werden? Wenn ich versuche, Kommas nicht zu wählen, wird "156.000" in [156 und] [000]

Der Test String ich habe mit wird

"156,000","",""i","parts","dog"","","Monthly "running" totals" 

Der ideale Wunsch-Capture-Ausgang ist

[156,000],[],[i],[parts],[dog],[],[Monthly "running" totals] 

kann ich mit oder ohne die internen Anführungszeichen tun, da ich sie immer nur während der Verarbeitung abziehen kann.

Vielen Dank für Ihre Zeit.

+0

Welche regex Geschmack verwenden Sie? – anubhava

+0

Ich analysiere direkt in C#, also .NET. –

Antwort

0

Ihre CSV ist in der Tat unregelmäßig und schwer zu analysieren. Ich schlage vor, dass Sie zuerst zwei Ersetzungen zu Ihren Daten vornehmen.

// remove all invalid double "" 
input = Regex.Replace(input, @"(?<!,|^)""(?=,|$)|(?<=,)""(?!,|$)", "\""); 

// now escape all inner " 
input = Regex.Replace(input, @"(?<!,|^)"(?!,|$)", @"\\\""); 

// at this stage your have proper CSV data and I suggest using a good .NET csv parser 
// to parse your data and get individual values 

Replacement 1 demo

Replacement 2 demo

Verwandte Themen