2017-05-15 8 views
0

Vor einer Weile habe ich zitiert auf beiden Seiten meiner Daten und lesen Sie es in Pandas pandas parse csv with left and right quote chars jetzt muss ich auch Zeilenumbrüche und einige seltsame Zeichen zu unterstützen.Pandas analysieren csv mit Zeilenumbrüchen

Minimum Beispiel unten, die erste Zeichenfolge (temp) wird gut funktionieren, aber die zweite wird nicht richtig analysieren.

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 

bearbeiten

Wie im Kommentar skizziert - wenn alle auf eine einzige Zeile setzen es ganz gut funktioniert. Wie könnte ich das vielleicht über sed/Awk automatisieren? awk '{printf("%s ",$0)} END{print ""}' sample.csv wird alle neue Zeilen entfernen und alles in einer einzigen Zeile verketten. Ich möchte nur die problematischen Zeilenumbrüche entfernen.

awk -F, 'NF < 4 {getline nextline; $0 = $0 nextline} 1' sample.csv wird bereits die normalen Zeilenumbrüche entfernen. Aber da sind noch die zusätzlichen Leerzeilen.

+0

Wenn ich die Zeilenumbrüche manuell entfernen, funktioniert das Parsing problemlos. –

Antwort

1

So sind Ihre "echten" Zeilenumbrüche mit $$>\n gekennzeichnet. Lesen Sie Ihre Datei in String, ersetzen Sie $$>\n durch etwas temporäres, entfernen Sie alle verbleibenden Zeilenumbrüche, fügen Sie die "echten" Zeilenumbrüche ein und übergeben Sie sie an read_csv().

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

Entschuldigung, ich musste das Beispiel aktualisieren. Sie sind nur mit '> \ n' gekennzeichnet und' df | >> \ n' verursacht auch hier Probleme. Aber Ihre Idee ist gut, d. H. Die Erweiterung des Musters auf>> n

+0

Sie könnten einen Multiprocessing-Prozesspool verwenden, um die Eingabedatei zu chunken. Wenn Sie jedoch die Verarbeitung auf 'big_df' in einem einzigen Prozess durchführen möchten, beachten Sie, dass die Serialisierung von Datenrahmen zwischen Prozessen nicht schnell ist. – Kyle