2016-07-13 7 views
0

Ich habe csv mit Zeilenumbruch in Spalte. Im Anschluss ist mein Beispiel:lesen csv-Datei in doppelte Anführungszeichen, aber mit Zeilenumbruch

"A","B","C" 
1,"This is csv with 
newline","This is another column" 
"This is newline 
and another line","apple","cat" 

ich die Datei in Funken lesen kann, aber die Neuen-Zeile in der Spalte als eine separate Zeile behandelt.

Wie kann ich das als csv mit Text innerhalb Doppelanführungszeichen bereit.

Ich lese Datei mit beiden Apache-CSV-Plugin und nur Apache.

alarms = sc.textFile("D:\Dataset\oneday\oneday.csv") 

Das gibt mir RDD:

**example.take(5)** 

[u'A,B,C', u'1,"This is csv with ', u'newline",This is another column', u'"This is newline', u'and another line",apple,cat'] 

Spark-Version: 1.4

+2

'line.replace ('/ n',‘ ') if line.count (' '')% 2 == 1 und '"\ n' nicht in Zeile ' –

Antwort

0

Wenn Sie Datenrahmen von csv mit Newline erstellen und durch doppelte Anführungszeichen zitiert, ohne dann neu zu erfinden Rad Funken csv und Common-csv-Bibliothek:

from pyspark.sql import SQLContext 
df = sqlContext.load(header="true",source="com.databricks.spark.csv", path = "hdfs://analytics.com.np:8020/hdp/badcsv.csv") 
+0

CSV-Parser von Commons wird auf Newline fehlschlagen, nicht wahr? Meintest du Univocity? – zero323

+0

@ zero323 Sie müssen Spark-CSV laden, sonst wird es fehlschlagen, wenn Sie common-csv verwenden. – kinkajou

+0

Es ist nicht was ich meine. 'commons' Parser, so weit ich mich erinnere, behandelt keine mehrzeiligen Datensätze. "Univocity" tut es. Beide mit 'spark-csv', obwohl dies in 2.0+ mehr oder weniger veraltet ist. – zero323

2

Der csv-Modul aus der Standard-Python-Bibliothek ist es aus der Box:

>>> txt = '''"A","B","C" 
1,"This is csv with 
newline","This is another column" 
"This is newline 
and another line","apple","cat"''' 
>>> import csv 
>>> import io 
>>> with io.BytesIO(txt) as fd: 
    rd = csv.reader(fd) 
    for row in rd: 
     print row 


['A', 'B', 'C'] 
['1', 'This is csv with \nnewline', 'This is another column'] 
['This is newline\nand another line', 'apple', 'cat'] 

Dies kann verwendet werden (mit einer erheblichen Leistungseinbuße über textFile) mit binaryFiles:

>>> (sc.binaryFiles(path) 
     .values() 
     .flatMap(lambda x: csv.reader(io.BytesIO(x)))) 
+1

@ zero323: Danke, dass du meine Antwort verbessert hast. Ich kenne das csv-Modul gut, indem ich nicht dasselbe für Funken sagen kann ... –

0

Sie brauchen nichts zu importieren. Die unten vorgeschlagene Lösung erstellt eine zweite Datei nur zu Demonstrationszwecken. Sie können die Zeile lesen, nachdem Sie sie geändert haben, ohne sie irgendwo zu schreiben.

with open(r'C:\Users\evkouni\Desktop\test_in.csv', 'r') as fin: 
    with open(r'C:\Users\evkouni\Desktop\test_out.csv', 'w') as fout: 
     cont = fin.readlines() 
     for line in cont[:-1]: 
      if line.count('"') % 2 == 1 and '"\n' not in line: 
       line = line.replace('\n', '') 
      fout.write(line) 

#DEMO 

#test_in.csv 
#------------ 
#"A";"B";"C" 
#1;"This is csv with 
#newline";"This is another column" 
#"This is newline 

#test_out.csv 
#------------ 
#"A";"B";"C" 
#1;"This is csv with newline";"This is another column" 
#"This is newline 

Wenn etwas nicht klar für Sie ist, lassen Sie es mich bitte wissen.

+1

Während es eine gute Antwort im Allgemeinen ist, adressiert es nicht wirklich bestimmten Kontext. – zero323

+0

@ zero323 was bedeutet das überhaupt? –

+0

@ zero323 OP sagte nichts über ihn Probleme beim Lesen csvs in Funken. Sein Problem waren neue Zeilenzeichen innerhalb der Spalteneinträge. Ich verstehe immer noch nicht, obwohl ich mit Funken nicht vertraut bin. –

Verwandte Themen