2016-06-18 10 views
0

Ich habe diesen Code, um eine komplizierte CSV-Datei in Stücke zu teilen. Das harte Bit ist, dass Kommas auch innerhalb von "" erscheinen dürfen und somit diese nicht geteilt werden dürfen. Die Regex ich verwende, um Kommas nicht innerhalb von "" funktioniert gut zu finden: comma_re = re.compile(r',(?=([^"]*""[^"]*"")*[^"]*$)')Regex vermeiden "Rest der Zeichenfolge" Split-Ergebnisse

Demo: here

import re 


test = 'Test1,Test2,"",Test3,Test4"",Test5' 
comma_re = re.compile(r',(?=([^"]*""[^"]*"")*[^"]*$)') 

print comma_re.split(test) 

Ausgang:

['Test1', 'Test2,"",Test3,Test4""', 'Test2', '"",Test3,Test4""', '"",Test3,Test4""', None, 'Test5']

Wunsch: ['Test1', 'Test2', '"",Test3,Test4""', 'Test5']

Wie kann Ich vermeide die nutzlosen Split-Ergebnisse?

Vielen Dank im Voraus!

UPDATE: Dumm ich wusste nicht einmal über eine Standard-CSV-Modul, weiterhin damit. Danke für Ihre Bemühungen!

+0

eine CSV-Modul noch versucht das? –

+0

Nein, noch nicht, der einzige schwierige Teil ist Splitting, der Rest, den ich tun muss, ist sehr einfach ... – pietv8x

+0

Parsing eine CSV-Datei mit einem Regex ist so eine schlechte Idee. Verwenden Sie einfach das dafür entwickelte csv-Modul – Keatinge

Antwort

1
(?<!"),(?![^",]+")|,(?=[^"]*$) 

Funktioniert für das von Ihnen angegebene Beispiel, obwohl es nicht funktioniert, wenn die Eingabe von diesem Format abweicht.

input = 'Test1,Test2,"",Test3,Test4"",Test5' 
output = re.split(r'(?<!"),(?![^",]+")|,(?=[^"]*$)', input) 
print(output) 

# ['Test1', 'Test2', '"",Test3,Test4""', 'Test5'] 

Python demo

Sie sollten für diese wirklich eine CSV-Parser werden. Wenn Sie das aus irgendeinem Grund nicht können - führen Sie einfach eine manuelle Zeichenfolgenverarbeitung aus, gehen Sie Zeichen für Zeichen durch und teilen Sie, wenn Sie ein Komma sehen, es sei denn, Sie haben erkannt, dass Sie in einer Zeichenfolge in Anführungszeichen stehen. Etwas wie folgt aus:

input = 'Test1,Test2,"",Test3,Test4"",Test5' 

insideQuoted = False 
output = [] 
lastIndex = 0 

for i in range(0, len(input)): 
    if input[i] == ',' and not insideQuoted: 
     output.append(input[lastIndex: i]) 
     lastIndex = i + 1 
    elif input[i] == '"' and i < len(input) - 1 and input[i + 1] == '"': 
     insideQuoted ^= True 
    elif i == len(input) - 1: 
     output.append(input[lastIndex: i + 1]) 

Demo

Verwandte Themen