2012-06-01 114 views
1

對不起,如果這是一個初學者的問題,但我沒有太多的python經驗,並真的可以用一些幫助來弄清楚這一點。如果有更好的編程語言來解決這個問題,我會更願意聽到它使用Python解析和重新格式化CSV /文本數據

我正在一個小項目,我有兩個數據塊,格式不同。它們都是以CSV文件格式保存的電子表格,我真的希望使一個組與另一組匹配,而無需手動編輯所有數據。

我需要做的就是去通過CSV,和格式保存的任何像這樣的數據:

10W

20E

15-16N

17-18S

以這樣的格式(分別對應的行格式):

10,W

20,E

,, 15,16,N

,, 17,18,S

讓他們只能在電子表格打開時複製。

我可以將文件轉換爲pyth中的字符串,但我不確定如何正確編寫某些內容以搜索數字連字符數字格式。

我會非常感謝任何幫助,我可以得到。由於

回答

1

這聽起來像是正則表達式的一個很好的用例。一旦你將線條拆分成單獨的字符串並剝離空白(使用s.strip()),這些應該可以工作(我假設這些是主要方向;如果假設不正確,則需要將[NESW]更改爲其他內容):

>>> import re 
>>> re.findall('\A(\d+)([NESW])', '16N') 
[('16', 'N')] 
>>> re.findall('\A(\d+)([NESW])', '15-16N') 
[] 
>>> re.findall('\A(\d+)-(\d+)([NESW])', '15-16N') 
[('15', '16', 'N')] 
>>> re.findall('\A(\d+)-(\d+)([NESW])', '16N') 
[] 

第一正則表達式'\A(\d+)([NESW])'僅與數字後跟大寫字母N,E,S或W的第二隻匹配的字符串,與隨後的數字序列開始的序列開頭的字符串匹配由一個連字符,後跟另一個數字序列,後跟一個大寫字母N,E,S或W.強制它在開始時匹配,以確保這些正則表達式不匹配較長字符串的後綴。

然後,你可以做這樣的事情:

>>> vals = re.findall('\A(\d+)([NESW])', '16N')[0] 
>>> ','.join(vals) 
'16,N' 
>>> vals = re.findall('(\d+)-(\d+)([NESW])', '15-16N')[0] 
>>> ',,' + ','.join(vals) 
',,15,16,N' 
+0

哇,謝謝你的快速反應。我仍然試圖繞過它,但我想我已經明白了。我假設一旦我將CSV分解爲字符串並可以通過第二位代碼運行這些代碼,我可以將每行代碼寫入一個新的CSV文件中?我對這個還很新,我只是想確保我把所有東西都正確地放下,哈哈。再次感謝您的幫助。 – UpstairsDownstairs

+0

@UpstairsDownstairs,是的,這聽起來像它會工作。另外,雖然我認爲我在這裏陳述的方法已經足夠,但您可以使用Python的內置['csv'](http://docs.python.org/library/csv.html)模塊。如果您的文件格式比您給出的示例文本更爲複雜,'csv'將幫助您更快地獲取簡化的字符串。 – senderle

+0

謝謝!我正在玩csv模塊,所以一旦我明白了,我會在這裏使用它。這太好了,再次感謝您幫助我。本週末我可能需要花幾個小時的時間來搞清楚一切,但這非常有幫助。對此,我真的非常感激。 – UpstairsDownstairs

0

在你的情況,我認爲快速的解決方案將涉及regexps

您可以使用match方法提取的不同的令牌時,他們匹配給定的正則表達式,或者split方法的字符串分割成令牌給出了分隔符。

但是,在您的情況下,分隔符將是單個字符,因此您可以使用str類中的split方法。

1

這是使用regexs的整體解決方案。 @senderle擊敗了我的答案,所以請隨時剔除他的回覆。這只是在這裏添加的,因爲我知道在我的代碼中首先將我的頭圍繞re是多麼困難。

import re 

dash = re.compile('(\d{2})-(\d{2})([WENS])') 
no_dash = re.compile('(\d{2})([WENS])') 

raw = '''10W 
20E 
15-16N 
17-18S''' 
lines = raw.split('\n') 

data = [] 

for l in lines: 
    if '-' in l: 
     match = re.search(dash, l).groups() 
     data.append(',,%s,%s,%s' % (match[0], match[1], match[2])) 
    else: 
     match = re.search(no_dash, l).groups() 
     data.append('%s,%s' % (match[0], match[1])) 

print '\n'.join(data) 
相關問題