2017-07-11 4 views
1

ich eine Master-CSV-Datei in Form habeErstellen mehrere Excel-Dateien mit mehreren Blättern

col1, col2, col3, col4... 
a, x, y, z 
a, x, y, z 
b, x, y, z 
b, x, y, z 
.. .. .. .. 

und ich möchte in diese Datei lesen. Erstelle ein neues Excel mit allen Werten Datei, in col1 == ein und eine andere Datei mit allen Werten col1 == b. So OutputFilea wird wie folgt aussehen:

col1, col2, col3, col4... 
a, x, y, z 
a, x, y, z 

und OutputFileb wie

aussehen
col1, col2, col3, col4... 
b, x, y, z 
b, x, y, z 

Meine Frage ist, sollte ich csv.reader() Zeile für Zeile und verwenden conditionals zu Bestimmen Sie, welche Datei angehängt werden soll oder ob ich eine Zeichenfolge an die Zeilen anhängen soll und schreiben Sie dann jede Datei am Ende. Oder gibt es ein Modul, das einen solchen Prozess optimiert?

+1

Was sind Ihre Kriterien für welchen Ansatz am besten? Es klingt, als wären sie alle vernünftige Herangehensweisen, was alles eine Frage der Meinung ist. –

+0

Das und die Tatsache, dass Sie nicht wirklich versucht haben, einen der Ansätze zu implementieren, um auf konkrete Probleme zu stoßen ... –

+0

@MadPhysicist Ich werde dies auf einem großen Datensatz implementieren und weiß nicht, ob diese Methoden werden sei zu langsam oder ineffizient, wenn diese Zeit kommt. – alexjones

Antwort

3

Da Sie mit großen Datensätzen arbeiten, ist es wahrscheinlich am besten, nicht zu viel im Speicher gleichzeitig zu halten. Sie können ein Wörterbuch der geöffneten Dateien verwalten, die durch das Zeilenpräfix verschlüsselt werden, und sicherstellen, dass die Dateien ordnungsgemäß mit einem contextlib.ExitStack geschlossen werden. Dadurch können Sie neue Dateien träge öffnen, wie Sie die Eingabe-Tabelle bearbeiten:

from contextlib import ExitStack 

output_files = {} 
with open('master.csv', 'r') as master, ExitStack() as output_stack: 
    for line in master: 
     prefix = line.split(',', 1)[0] 
     if prefix not in output_files: 
      output_name = 'output' + prefix + '.csv' 
      output = output_stack.enter_context(open(output_name, 'w')) 
      output_files[prefix] = output 
     else: 
      output = output_files[prefix] 
     print(line, file=output) 

Vorausgesetzt, dass Sie die Zeilen kopieren möchten in die Ausgabedateien, wie sie ist, habe ich entschieden, nicht die csv Modul zu verwenden. Wenn Sie eine komplexere Verarbeitung anwenden möchten, sollten Sie in Betracht ziehen, sie natürlich hinzuzufügen.

2

Ich würde vorschlagen, pandas für diese Art von Zeug zu versuchen. Es gibt eine spezielle Funktion, um in Excel zu schreiben. In diesem Fall denke ich, Ihre CSV-Datei in eine Pandas Datenrahmen lesen df:

In [4]: df = pd.read_csv('yourfile.csv') 

In [5]: df 
Out[5]: 
    col1 col2 col3 col4 
0 a  x  y  z 
1 a  x  y  z 
2 b  x  y  z 
3 b  x  y  z 

Dann kann ich nur die Werte auswählen I filtern möchten und auszuzeichnen sparen:

In [6]: dfa = df[df['col1']=='a'] 

In [7]: dfa 
Out[7]: 
    col1 col2 col3 col4 
0 a  x  y  z 
1 a  x  y  z 

In [8]: dfa.to_excel('OutputFilea.xls') 

Das gleiche geschieht mit der zweite Filter:

In [9]: dfb = df[df['col1']=='b'] 

In [10]: dfb.to_excel('OutputFileb.xls') 

Hoffe, dass hilft.

+0

Das sollte sehr hilfreich sein, danke. – alexjones

Verwandte Themen