2016-06-18 13 views
0

私は複雑なCSVファイルをチャンクに分割するこのコードを持っています。難しいのは、カンマもまた ""の中に現れる可能性があります。したがって、それらは分割してはいけません。私は "ない" 内のカンマを見つけるために使用しています正規表現が正常に動作します:comma_re = re.compile(r',(?=([^"]*""[^"]*"")*[^"]*$)')Regexは "残りの文字列"分割結果を避ける

デモ:here

import re 


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

print comma_re.split(test) 

出力:理想の

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

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

どのようにすることができます私は無駄な分割結果を避けますか?

ありがとうございます!

更新: 愚かな私は既定のcsvモジュールについて知らず、それを続けました。あなたの努力をありがとう!

+0

はまだCSVモジュールを試してみましたか? –

+0

まだ、唯一の難しい部分は分割されていますが、残りの部分は非常に簡単です。 – pietv8x

+0

正規表現でcsvファイルを解析するのは悪い考えです。このために構築されたcsvモジュールを使用するだけです – Keatinge

答えて

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

あなたが与えた例では動作しますが、入力がその形式と異なる場合は動作しません。あなたは本当にこの用CSVパーサーを使用する必要があり

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

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

Python demo

。なんらかの理由でできない場合は、引用符で囲まれた文字列内にあることを認識していない限り、手動で文字列を処理し、文字で文字を切り取り、コンマが見えるときに分割するだけです。以下のような何か:

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

関連する問題