2016-06-09 47 views
-1

我解析了用逗號分隔的Python文件,其中一些文本字段是用引號雙分隔的,因爲文本包含非定界逗號。例如,給定此線路輸入的:用Python解析雙定界文件

field_1,field_2,...,"this,field,contains,non-delimiting,commas",...,field_n 

我需要治療"this,field,contains,non-delimiting,commas"作爲含有討厭的逗號單引號分隔字段。

我的代碼通過比較每行輸入中的所有逗號和引號的索引,並在配對引號之外的所有逗號的索引處對行進行切片來處理此操作。

雖然這讓我覺得非pythonic,我希望能得到一些獲得更多pythonic解決方案的建議。

+0

像field_1這樣的字段可以像整數嗎?例如123,「helloWorld」,99,「ha,ha,ha」 –

+0

@ SamuelToh:是的。字段可以包含任何字符並表示任何數據類型。在這個階段唯一的考慮就是在處理內部分隔符時將字段標記爲文本。 – Schemer

+5

使用csv閱讀器:https://docs.python.org/2/library/csv.html –

回答

0

您可以使用一個相當簡單的generator來完成此操作。

def tokenize(input): 
    outstr = "" 
    stringmode = False 
    for char in input: 
     if char == "," and not stringmode: 
      yield outstr 
      outstr = "" 
      continue 
     elif char == "'" or char == '"': 
      stringmode = not stringmode 
     outstr += char 

首先,我們把輸入到其自身的逆轉列表,這樣我們就可以從字符串前的有效彈出字符。然後我們簡單地遍歷字符串,當我們到達逗號並且不在報價中時產生,並在每次達到報價時切換我們是否在報價中。

+0

是否有一個原因,你正在使數據「反轉」,然後做'while input:char = input.pop() '而不是隻是在輸入中輸入char:'? –

+0

@ TadhgMcDonald-Jensen最初有,但經過一番思考後,我擺脫了需要它的部分,但沒有改變它。 – Natecat

+3

爲什麼我們重新創建[csv'模塊](https://docs.python.org/2/library/csv.html)? – ShadowRanger