2009-07-07 14 views
0

ich eine CSV-Datei, die das folgende Format hat:Python-Strings/match Fall

id,case1,case2,case3 

ist hier ein Beispiel:

123,null,X,Y 

342,X,X,Y 

456,null,null,null 

789,null,null,X 

Für jede Zeile Ich muss wissen, welche der Fälle ist nicht null. Gibt es einen einfachen Weg, herauszufinden, welche Fälle nicht null sind, ohne die Kette zu teilen und durch jedes Element zu gehen? Diese

ist, was das Ergebnis sollte wie folgt aussehen:

123,case2:case3 

342,case1:case2:case3 

456:None 

789:case3 

Antwort

2

Sie wahrscheinlich einen Blick auf die CSV module nehmen wollen, die Leser und Schreiber hat, die es Ihnen ermöglicht, Transformationen zu erstellen.

>>> from StringIO import StringIO 
>>> from csv import DictReader 
>>> fh = StringIO(""" 
... id,case1,case2,case3 
... 
... 123,null,X,Y 
... 
... 342,X,X,Y 
... 
... 456,null,null,null 
... 
... 789,null,null,X 
... """.strip()) 
>>> dr = DictReader(fh) 
>>> dr.next() 
{'case1': 'null', 'case3': 'Y', 'case2': 'X', 'id': '123'} 

an welcher Stelle Sie können wie etwas tun:

>>> from csv import DictWriter 
>>> out_fh = StringIO() 
>>> writer = DictWriter(fh, fieldnames=dr.fieldnames) 
>>> for mapping in dr: 
...  writer.write(dict((k, v) for k, v in mapping.items() if v != 'null')) 
... 

Das letzte Bit ist nur Pseudo-Code - nicht sicher dr.fieldnames eigentlich eine Eigenschaft ist. Ersetzen Sie out_fh durch das Dateihandle, das Sie ausgeben möchten.

+0

Auch das letzte Schnipsel hat nicht genau die Ausgabe, die Sie gesucht haben, aber es wird dir 90% des Weges dorthin bringen. :-) – cdleary

0

Warum behandeln Sie Splitten als Problem? Aus Leistungsgründen?

Wörtlich könnte man Spaltung mit intelligentem regexps vermeiden (wie:

\d+,null,\w+,\w+ 
\d+,\w+,null,\w+ 
... 

aber ich finde es eine schlechtere Lösung als die Daten in Listen neuparsen

+1

Regexps sind ein Parsing-Problem, genau wie Splitting. Abgesehen davon, dass sie viel teurer sind als das Teilen mit einer einfachen Suche nach Zeichen. – Christopher

+0

Sie haben Recht. Dann habe ich keine Ahnung, wie ich die Spaltung vermeiden kann. –

1

Wie auch immer Sie in Scheiben schneiden, Sie immer noch wollen. hat in der Liste zu gehen. es gibt mehr und weniger elegante Möglichkeiten, es zu tun. in Abhängigkeit von der python-Version, die Sie verwenden, können Sie Listenkomprehensionen verwenden.

ids=line.split(",") 
print "%s:%s" % (ids[0], ":".join(["case%d" % x for x in range(1, len(ids)) if ids[x] != "null"]) 
0

Sie cou ld verwenden Sie die Python csv module, kommt mit der Standard-Installation von Python ... Es wird nicht much einfacher, obwohl ...