2017-01-12 3 views
1

Mein Problem ist:Regex csv reinigen von verwirrenden Zeichen

ich eine csv bin mit, die von einigen Software herauskam, und das Problem ist, dass diese Software nicht csv ist der Umgang mit so gut Ursache gibt es einige Zeichenketten sind in die CSV, die in ihnen Zitat haben und was eine Zeichenfolge umschließt, ist auch Anführungszeichen, also habe ich Probleme, es zu analysieren.

so ist das normal csv:

"one","two","three" 

und hier ist mein Fall:

"one","tw"o","three" 

So Ausgaben Ich habe Strings wie "tw"o" Parsen. Dies ist im Grunde ein Problem mit der Software, die die Datei ausgibt, und ich kann diese Software nicht bearbeiten.

Also dachte ich, ich könnte eine Regex erstellen, die die unnötigen Anführungszeichen oder Kommas nehmen und sicherstellen, dass jede Zeichenfolge in Anführungszeichen eingeschlossen und durch Komma getrennt ist, weiß jemand, wie kann ich es erreichen?

im tototoshi Bibliothek für scala

+0

Gibt es einen bestimmten Grund, warum Sie Pythons 'csv' Paket nicht verwenden, um die' .csv' Datei zu verarbeiten? –

+0

@WillemVanOnsem im Verwenden von Tototoshi für Scala, aber diese Bibliotheken können es nicht analysieren, da es kein richtiges Format ist ... wenn es "eins", "zwei", "drei" kein Problem war, aber sein "eins", "tw" o "," drei ", also kann die Bibliothek es nicht analysieren – JohnBigs

+0

Warum immer auf reguläre Ausdrücke achten? Auch wenn Sie etwas dafür finden, nehme ich an *, dass das ziemlich schrecklich aussehen könnte. Heck: Sie brauchen ** andere Leute Wie leicht wird es dann sein, dass du diesen Regex im Laufe der Zeit aufrecht erhältst? "Sinn: Manchmal sollte man darüber nachdenken, seinen * eigenen * Parser zu schreiben und die Dinge explizit zu machen, anstatt einen Monsterregex zu erzwingen . – GhostCat

Antwort

1

Ich habe versucht, Python csv-Modul, und es war in der Lage zu tun, dass (klingt wie ein Hack, aber die Eingabedatei ist falsch, nachdem alle, und regex ein Hack wäre) unter Verwendung von :

import csv 

z = '''"one","tw"o","three"''' 

cr = csv.reader([z]) 
print(next(cr)) 

Ergebnis:

['one', 'two"', 'three'] 

aus irgendeinem Grund hat das Zitat am Ende der Zeichenfolge (eine gültige Art und Weise zu setzen doppelte Anführungszeichen in einem Feld wäre es zu verdoppeln) verschoben .

es entfernen Sie

print([x.replace('"',"") for x in next(cr)]) 

tun können

['one', 'two', 'three'] 

Note zu bekommen, dass csv 4 Felder mit "one","tw",o","three" so ausgeben, wenn das Zitat durch ein Komma gefolgt ist, funktioniert nichts, nur ein Mensch Überprüfung kann das beheben.

0

Eine ziemlich einfache Regex-Lösung, die für Sie arbeiten kann, ist dies:

regex: (?<=\w)"(?=\w) //global flag

ersetzen: '' //blank string

Solange wir „schlecht“ doppelte Anführungszeichen wie die anzeigen können, die sind umgeben von alphanumerischen Zeichen, wird dies funktionieren. Es ist nur ein Lookbehind für ein alphanumerisches, ein Doppelzitat und Lookahead für eine alphanumerische. Es würde nicht mit einem doppelten Anführungsstrich übereinstimmen, der mit einem umgekehrten Schrägstrich oder einem anderen doppelten Anführungsstrich entkernt wird, also wäre "" oder \" okay.

demo here

0

Sieht aus wie Sie können nicht vorhersagen, welche Art von Werten mit unescaped Anführungszeichen Sie könnten bekommen. Es gibt keine Möglichkeit, dies zuverlässig mit Regex zu säubern.

Versuchen Sie vielleicht univocity-parsers, da es einen CSV-Parser hat, der diese Art von Eingabe richtig verarbeiten kann. Beispiel:

//first configure the parser 
    CsvParserSettings settings = new CsvParserSettings(); 

    //override the default unescape quote handling. This seems more appropriate for your case. 
    settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.STOP_AT_CLOSING_QUOTE); 

    //then create a parser and parse your input line: 
    CsvParser parser = new CsvParser(settings); 
    List<String[]> results = parser.parseAll(<your input here>); 

Ich hoffe, es hilft.

Haftungsausschluss: Ich bin der Autor dieser Bibliothek. Es ist open-source und frei (Apache v2.0 Lizenz)