2012-07-09 120 views
0
def csv_split() : 
    raw = [ 
      '"1,2,3" , "4,5,6" , "456,789"', 
      '"text":"a,b,c,d", "gate":"456,789"' 
      ] 
    cr = csv.reader(raw, skipinitialspace=True) 
    for l in cr : 
     print len(l), l 

下面這個函數輸出正確劃分:CSV文件不能被Python

3 ['1,2,3 ', '4,5,6 ', '456,789'] 
6 ['text:"a', 'b', 'c', 'd"', 'gate:"456', '789"'] 

正如你所知道的,第一行是正確分成3項。 但第二行不是。我希望csv閱讀器將其拆分爲兩個,而我們在這裏有6個。我也想過正則表達式 的方法,但它假設了一些具體的引用方言。

基本上我想要的是: 只需在「」中分割字符串,該字符串不會在「」的一對 中引用。

有沒有任何快速和一般的方法來做到這一點?我看到一些正則表達式的黑客,其中 假設每個領域總是引用等。我想我可以寫一個小循環 ,這是非常低效,但肯定會讚賞一些更專業的建議。非常感謝!

+1

它正確地分裂它。您的CSV數據格式錯誤。你認爲它應該如何分裂? – 2012-07-09 01:58:08

+0

你應該說出你真正想要的第二行,因爲我無法弄清楚你要求的是什麼。 – Gabe 2012-07-09 02:03:45

+0

@加貝我認爲OP期望''「文本」:「a,b,c,d」和「gate」:「456,789」 - 如果我誤解了,請糾正我。 – Levon 2012-07-09 02:12:49

回答

2

CSV不是一種標準格式,但如果它們出現在文本內部(例如"text"":""a,b,c,d"),則通過使用兩個""來避免使用引號是很常見的。 Python的CSV閱讀器在這裏做着正確的事情,因爲它假定了這個約定。我不太清楚你期望的輸出是什麼,但這裏是我嘗試一個非常簡單的CSV閱讀器,它可能適合你的格式。隨意適應它。

raw = [ 
    '"1,2,3" , "4,5,6" , "456,789"', 
    '"text":"a,b,c,d", "gate":"456,789"', 
    '1,2, 3,' 
] 

for line in raw: 
    i, quoted, row = 0, False, [] 
    for j, c in enumerate(line): 
     if c == ',' and not quoted: 
      row.append(line[i:j].strip()) 
      i = j + 1 
     elif c == '"': 
      quoted = not quoted 
    row.append(line[i:j+1].strip()) 
    for i in range(len(row)): 
     if len(row[i]) >= 2 and row[i][0] == '"' and row[i][-1] == '"': 
      row[i] = row[i][1:-1] # remove quotation marks 
    print row 

輸出:

['1,2,3', '4,5,6', '456,789'] 
['text":"a,b,c,d', 'gate":"456,789'] 
['1', '2', '3', ''] 
+0

對不起,延遲迴復。 ' 「文」: 「A,B,C,d」, 「門」: 「456789」' 應分成兩個條目: [「「的文字但是,是的,我想以上提到的「:」a,b,c,d「,」「大門」:「456,789」']。 就像我說的,我只是想在逗號沒有被引用時分裂。 我同意CSV格式有點搞砸了。但是你知道我有時無法控制我所得到的 。 :( 感謝您的好解答,我會嘗試一下,看看如何最好地解決這個問題。 – user1510809 2012-07-12 00:28:28

0

離開這個位置留給後人,因爲我這個奮鬥了有點太。

csv.reader()quotechar參數有助於解決此問題;如果它們在引號內(假設條目中的所有逗號都被引用過),它會讓你忽略delims(即在這種情況下的逗號)。也就是說,它會爲這方面的工作:

Name, Message 
Ford Prefect, Imagine this fork as the temporal universe. 
Arthur Dent, "Hey, I was using that!" 

...其中逗號已嵌套引號,但是非comma'd串也沒有。

演示代碼從Py2 docs撕開,並編輯,以便delimiter是一個逗號(杜)和quotechar是您的雙引號"

import csv 
with open('eggs.csv', 'rb') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=',', quotechar='"') 
    for row in spamreader: 
     print ', '.join(row)