2016-09-22 4 views
0

Ich habe einen Daten-Dump, der eine "versaute" CSV ist. (Etwa 100 Dateien mit jeweils etwa 1000 Zeilen tatsächlicher CSV-Daten.)
Der Dump enthält neben CSV noch einen anderen Text. Wie kann ich den CSV-Teil programmatisch extrahieren?identifizieren csv in Python

Als Beispiel wird die Datendatei sieht aus wie so etwas wie dieses

Session:1 
Data collection date: 09-09-2016 
Related questions: 
    Question 1: parta, partb, partc, 
    Question 2: parta, partb, partc 

"field1","field2","field3","field4" 
"data11","data12","data13","data14" 
"data21","data22","data23","data24" 
"data31","data32","data33","data34" 
"data41","data42","data43","data44" 
"data51","data52","data53","data54" 

Ich brauche den csv Teil zu extrahieren.

Vorbehalte,
Der Text am Anfang ist nicht auf 4 bis 5 Zeilen begrenzt.
der zusätzliche Text ist nicht nur am Anfang der Datei

ich this post sah die re.split und/oder csv.Sniffer, aber mein Versuch nicht erfolgreich war schlägt mit.

Für jetzt bin ich in der Lage, die csv Linien genau zu identifizieren, nur wenn es eine Reihe von Daten gibt.

Gibt es etwas besseres, was ich tun kann?

+0

Was trennt dann die Zeilen mit Daten und Zeilen mit Text? Kann eine Textzeile mit "? – Aidenhjj

+0

also, das ist, wo das Problem liegt, gibt es nichts, das CSV-Daten vom Text trennt, es sei denn, Sie leere Zeilen als Trennzeichen betrachten. – okkhoy

Antwort

1

Wie wäre es damit:

import re 

my_pattern = re.compile("(\"[\w]+\",)+") 

with open('<your_file>', 'rb') as fi: 
    for f in fi: 
     result = my_pattern.match(f) 
     if result: 
      print f 

die CSV-Daten Unter der Annahme kann von der zu unterscheiden Ruhe, indem Sie keine Sonderzeichen in ihnen haben (wir akzeptieren nur jedes Element, um Buchstaben oder Zahlen umgeben von Anführungszeichen und ein Komma zu haben, um vom nächsten Element zu trennen)

+0

Hinweis für Selbst: müssen lernen, wie man reguläre Ausdrücke verwenden .. .much bessere Antwort! – Aidenhjj

+0

Glücklich zu helfen. Sie konnten die Antwort annehmen, wenn es Ihr Problem löst. –

+0

Nicht meine Frage! – Aidenhjj

0

Wenn Ihre csv Zeilen und nur die Zeilen beginnen mit \“, dann können Sie dies tun:

import csv 

data = list(csv.reader(open("test.csv", 'rb'), quotechar='¬')) 
# for quotechar - use something that won't turn up in data 

def importCSV(data): 
    # outputs list of list with required data 
    # works on the assumption that all required data starts with \" 
    # and that no text starts with \" 

    out = [] 

    for line in data: 
     if (line != []) and (line[0][0] == "\""): 
      line = [el.replace("\"", "") for el in line] 
      out.append(line) 

    return out 

useful = importCSV(data) 
0

Können Sie nicht jedes lesen Linie und eine Regex um Wetter zu sehen oder nicht die Daten zu ziehen? Vielleicht so etwas wie:

^([ "] [\ w] ["] [,]) + [ "] [\ w] ["] $

Meine regex ist nicht die beste und es könnte wahrscheinlich einen besseren Weg geben, aber das schien für mich zu funktionieren.