2017-05-15 26 views
0

前段時間我在我的數據兩邊用引號把它讀入pandas parse csv with left and right quote chars現在我還需要支持換行符和一些奇怪的字符。大熊貓用換行符解析csv

下面的最小樣本,第一個字符串(temp)將工作得很好,但第二個字符串不會正確解析。

import pandas as pd 
import os 
from pandas.compat import StringIO 

temp=u"""<first>$$><$$<second>$$><$$<first> 
<foo>$$><$$<bar>$$><$$<baz>""" 

temp=u"""<first>$$><$$<second>$$><$$<third> 
<foo>$$><$$<bar>$$><$$<baz> 
<foo>$$><$$<Green; kkkk 101; aaaa, bbb; [foo<1>>aaa<123>>xxx<1>>zzz<1.17989207 | 18187681 | asdf |>> 
;sdf{ 

} 
;ADD{ 

]>$$><$$<baz>""" 

big_df = pd.read_csv(StringIO(temp), 
       encoding='utf8', 
       sep='\$\$><\$\$', 
       decimal=',', 
       engine='python') # we cant use pandas optimized C parser due to our special delimiters. 

big_df.iloc[:, -1] = big_df.iloc[:, -1].str.replace('\$\$>$', '') 
big_df.iloc[:, -1] = big_df.iloc[:, -1].str.replace('\$\$>$', '') 
big_df = big_df.replace(['^<', '>$'], ['', ''], regex=True) 

big_df.columns = big_df.columns.to_series().replace(['^<', '>$', '>\$\$'], ['', '', ''], regex=True) 
big_df 

編輯

正如評論概述 - 把所有到它工作得很好一行時。 我該如何通過sed/Awk自動執行此操作? awk '{printf("%s ",$0)} END{print ""}' sample.csv將刪除全部新行並將所有內容連接成一行。我寧願只想刪除有問題的換行符。

awk -F, 'NF < 4 {getline nextline; $0 = $0 nextline} 1' sample.csv已經刪除了正常的換行符。但仍然有額外的空白行。

+0

當我手動刪除換行符時,解析工作得很好。 –

回答

1

所以你的「真正的」換行符被標記爲$$>\n。將文件讀入字符串,用臨時替換$$>\n,刪除所有剩下的換行符,重新插入「真正的」換行符,然後傳遞給read_csv()。

temp = temp.replace('$$>\n', '%%NEWLINE%%').replace('\n','').replace('%%NEWLINE%%', '\n') 
big_df = pd.read_csv(StringIO(temp), ...) 
+0

對不起,我需要更新示例。它們只用'> \ n'標記,'df | >> \ n'也在這裏引起問題。但是你的想法是好的,即把模式擴展到'> \ n <'似乎工作。有沒有可能使用sed/awk/pyhton multiprocessing來提高速度? –

+0

您可以使用多進程進程池對輸入文件進行分塊,但是如果您想在單進程中對big_df進行處理,請注意在進程之間序列化數據幀的速度並不快。 – Kyle