2014-09-13 76 views
0

我有一個csv文件,使用þ作爲報價,段落符號作爲逗號分隔值。read_csv使用不常見的分隔符

使用子類csv.Dialect不起作用。熊貓不會將這個數值解釋爲一個字符串。

任何想法?

# This works when the delimiters are more standard (; ") 
# But really trying to make it work with the ASCII chars commented out below 

import csv 

f = open('./data/Test_Quote_SemiColon.dat') 

class my_dialect(csv.Dialect): 
    lineterminator = '\n' 
    delimiter = ';' # ASCII: 020 
    quotechar = '"' # ASCII: 254 

reader = csv.reader(f, dialect=my_dialect, quoting=1) 

for line in reader: 
    print line 

這裏是(報價和半結腸)數據:

「BEGID」; 「endID所」, 「名稱」, 「要」, 「從」; 「CC」, 「BCC」 「ABC_001」;「ABC_004」;「Smith,John」;「Doe,John」;「Roe,Jane」;「」;「」012_「ABC_005」;「ABC_007」 John「;」「;」「」;「」012_「ABC_008」;「ABC_012」;「Doe,John」;「Doe,John」;「Smith,John」;「」;「」

+1

你能給你的數據的一個小例子(過去的CSV文件,或東西,看起來像它和複製問題的一部分),以及您用熊貓閱讀的代碼。 – joris 2014-09-13 17:58:39

+0

在csv上使用什麼編碼?你有沒有試過改變編碼?你知道這些符號的ASCII代碼,所以你可以做sep ='something'和quote ='something'? – Inox 2014-09-13 20:53:18

回答

0

我發現文字和chr(254)工作解析此。這看起來正確嗎?

>>> import StringIO 
>>> txt = '''þBEGIDþþENDIDþþNameþþToþþFromþþCCþþBCCþ þABC_001þþaBC_004þþSmith, JohnþþDoe, JohnþRoe, Janeþþþþþ þABC_005þþaBC_007þþSmith, JohnþþDoe, Johnþþþþþþ þABC_008þþaBC_012þþDoe, JohnþþDoe, JohnþSmith, Johnþþþþþ''' 
>>> reader = csv.reader(StringIO.StringIO(txt), delimiter=',', quotechar=chr(254)) 
>>> for line in reader: 
...  for entry in line: 
...   print unicode(entry, 'utf8') 
... 
þBEGIDþþENDIDþþNameþþToþþFromþþCCþþBCCþ þABC_001þþaBC_004þþSmith 
JohnþþDoe 
JohnþRoe 
Janeþþþþþ þABC_005þþaBC_007þþSmith 
JohnþþDoe 
Johnþþþþþþ þABC_008þþaBC_012þþDoe 
JohnþþDoe 
JohnþSmith 
Johnþþþþþ 

txt相呼應,如:

>>> txt 
'\xc3\xbeBEGID\xc3\xbe\xc3\xbeENDID\xc3\xbe\xc3\xbeName\xc3\xbe\xc3\xbeTo\xc3\xbe\xc3\xbeFrom\xc3\xbe\xc3\xbeCC\xc3\xbe\xc3\xbeBCC\xc3\xbe \xc3\xbeABC_001\xc3\xbe\xc3\xbeaBC_004\xc3\xbe\xc3\xbeSmith, John\xc3\xbe\xc3\xbeDoe, John\xc3\xbeRoe, Jane\xc3\xbe\xc3\xbe\xc3\xbe\xc3\xbe\xc3\xbe \xc3\xbeABC_005\xc3\xbe\xc3\xbeaBC_007\xc3\xbe\xc3\xbeSmith, John\xc3\xbe\xc3\xbeDoe, John\xc3\xbe\xc3\xbe\xc3\xbe\xc3\xbe\xc3\xbe\xc3\xbe \xc3\xbeABC_008\xc3\xbe\xc3\xbeaBC_012\xc3\xbe\xc3\xbeDoe, John\xc3\xbe\xc3\xbeDoe, John\xc3\xbeSmith, John\xc3\xbe\xc3\xbe\xc3\xbe\xc3\xbe\xc3\xbe' 
+0

僅供參考,使用iPython Notebook 2.2,Python 2.7.6 我看到StringIO出錯。什麼是進口? – CAtoDC 2014-09-14 13:08:28

+0

關閉 - 但不完全。我認爲它需要一個lineterminator值。 它應該看起來像這樣(沒有單引號): ['BEGID','ENDID','Name','To','From','CC','BCC'] ['ABC_001' ,'ABC_004','Smith,John','Doe,John','Roe,Jane','','']''ABC_005','ABC_007','Smith,John','Doe,John' ,'','',''] ['ABC_008','ABC_012','Doe,John','Doe,John','Smith,John','',''] – CAtoDC 2014-09-15 02:16:25