2017-12-13 9 views
-2

Ich habe einen Raum getrennt Datei (file1.csv), auf dem I 3 UNIX Operationen manuell durchführen, nämlich:tun grundlegende Operationen UNIX Pythonic Weise

Schritt1. Entfernen Sie alle doppelten Anführungszeichen (") aus jeder Zeile.

sed 's/"//g' file1.csv > file_tmp1.csv 

schritt2. alle weißen Leerzeichen am Anfang jeder Zeile zu entfernen.

sed 's/^ *//' file_tmp1.csv > file_tmp2.csv 

step3. Alle zusätzlichen weißen Zwischenräume Texten jedes Entfernen Linie.

cat file_tmp2.csv | tr -s " " > file1_processed.csv 

wollte also wissen, ich, wenn es ohne viel von einer Rechenzeit in einer Pythonic Weise dies und das zu einem besseren Ansatz ist. diese drei Schritte dauern ca. ~ 5 min (max), wenn tun ne mit UNIX-Befehlen.

Bitte beachten Sie die Datei file1.csv ist eine durch Leerzeichen getrennte Datei und ich möchte es durch Leerzeichen getrennt bleiben.

Auch wenn Ihre Lösung schlägt gesamte file1.csv in den Speicher geladen, dann würde ich Sie bitten, einen Weg zu empfehlen, wo diese in Stücke getan wird, weil die Datei viel zu groß ist (~ 20 GB oder so) jedes Mal in den Speicher zu laden.

danke im voraus.

+2

Ich bezweifle, dass Sie sogar die Leistung von UNIX-Tools erreichen können. Beachten Sie, dass diese Tools in C geschrieben und für die Leistung optimiert sind. – hek2mgl

+0

Müssen Sie es in Python tun, oder dachten Sie einfach, dass Python schneller wäre? – user1767754

+1

Vielleicht Rohrleitungen, zumindest die Befehle? So, dass keine Zwischendatei erzeugt wird und ein Singe-Pass eine bestimmte Datei transformiert? –

Antwort

2

Eine offensichtliche Verbesserung wäre, den Schritt tr in sed zu konvertieren und alle Teile zu einem Job zu kombinieren. Zuerst werden die Testdaten:

$ cat file 
"this" "that" 

Der Job:

$ sed 's/"//g;s/^ *//;s/ \+/ /g' file 
this that 

hier alle diese Schritte in einem awk:

$ awk '{gsub(/\"|^ +/,""); gsub(/ +/," ")}1' file 
this that 

Wenn Sie es testen, lassen Sie mich wissen, wie lange es dauerte, .

0

Hier ist ein Prozess, der Zeile für Zeile liest und die in Python angegebenen Ersetzungen durchführt.

with open('file1.csv') as source: 
    for line in source: 
     print(' '.join(line.replace('"', '').split()) 

Das Standardverhalten von split() schließe jeden führende (und Hinter) Leerzeichen Trimmen, so spezifizieren wir nicht, dass explizit. Wenn Sie Leerzeichen beibehalten möchten, müssen Sie möglicherweise Ihre Anforderungen aktualisieren.

Ihr Shell-Skript Versuch mit mehreren temporären Dateien und mehrere Aufrufe von sed sind kein gutes Beispiel dafür, wie dies in der Shell zu tun.

Verwandte Themen