2017-05-15 18 views
0

私は自分のデータの両側に引用符を使用してパンダpandas parse csv with left and right quote charsに読み込んでいますが、改行やいくつかの奇妙な文字もサポートする必要があります。pandas改行でcsvをパーズ

最初の文字列(temp)は正常に動作しますが、2番目の文字列は正しく解析されません。コメントで概説したように

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すべて改行を削除し、すべてを1行に連結します。むしろ問題のある改行を削除したいだけです。

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マルチプロセッシングを使ってこれを高速化する可能性はありますか? –

+0

マルチプロセッシングプロセスプールを使用して入力ファイルをチャンクすることはできますが、単一のプロセスで 'big_df 'の処理を行う場合は、プロセス間のデータフレームのシリアル化が高速ではないことに注意してください。 – Kyle

関連する問題