2016-11-21 2 views
2

Ich habe eine einfache csv mit Zitaten, so etwas wie:regex csv zu beheben zitiert

"etwas", "etwas", "etwas", "etwas", ...

Aber manchmal bekomme ich csv mit

"etwas", "som" ething "", "s" omething“, ...

und ich wollte eine Regex erstellen, die dieses Problem beheben wird, hat jemand etwas zu bieten?

etwas, das alles herausnehmen aus der Zeichenfolge, die nicht eine Zahl oder ein Text ist, aber wenn ich " Ich muss nehmen, um sicher sein nicht diejenigen machen, die die Zeichenfolge begrenzt, weil ich diejenigen brauchen ..

so aus "som"ething"","s"ometh8 ing" id expect =>"something","someth8 ing"

ich benutze scala aber jede Lösung wird großartig!

danke !!

+1

können Sie 'verwenden, enthalten können‚"‘ + x.replace (' " ',' ') +' '' 'für jeden der Werte –

+1

Gibt es einen bestimmten Grund, warum Sie regex verwenden möchten? Ein string replace wäre viel einfacher. – duncan

+0

Was ist mit korrekt gemerkten Anführungszeichen, zB' "a" "b "," cd "' –

Antwort

0

Einfache Lösung

Eine einfache Lösung in Scala:

scala> val input = """"som"ething"","s"ometh8 ing"""" 
input: String = "som"ething"","s"ometh8 ing" 

scala> val values = input.split("\",\"").map(_.filter(c => c.isLetterOrDigit || c.isWhitespace)) 
values: Array[String] = Array(something, someth8 ing) 

scala> val output = values.mkString("\"", "\",\"", "\"") 
output: String = "something","someth8 ing" 

Vorausgesetzt, dass Sie nie "," in Ihrem Wert haben, aber wenn Sie tun, dann gibt es keine Möglichkeit, Ihre CSV eindeutig sowieso zu beheben.

Dies ist nicht die optimale Lösung Geschwindigkeit oder Speicher, aber es ist kurz und einfach.

EDIT: Regex Lösung

Falls Sie einige reguläre Ausdrücke wirklich wollen, genießen:

scala> input.replaceAll("""(^"|"$|","|[\p{IsAlphabetic}\p{Digit}\p{Space}])|.""", "$1") 
res17: String = "something","someth8 ing" 

Dieser versucht " am Anfang oder Ende der Eingabe übereinstimmen ODER "," sonstwo oder Ihre genehmigt Figuren. Wenn diese übereinstimmen, wird die erste erfassende Gruppe angezeigt. Ansonsten entspricht es einem beliebigen Zeichen (.), erfasst es jedoch nicht in einer Gruppe, sodass die erste Gruppe leer bleibt. Dann wird die übereinstimmende Teilzeichenfolge durch $1 ersetzt, was der Inhalt der ersten einfangenden Gruppe ist.

Ich denke immer noch, dass die erste Lösung sauberer und einfacher zu verstehen ist.

0
import re 
csv_string = '"something","som"ething"","s"omething"' 
for each_str in re.findall(r'(.*?)[\,\n]', csv_string): 
    print(re.sub(r'\"', '', each_str) 

einen Zeilenvorschub, bis zum Ende des Strings hinzufügen, so dass Sie den letzten Teil der Zeichenfolge in re.findall