2016-11-11 3 views
1

ich eine TON von Daten in einer TXT-Datei wie so ...übermäßige Räume einem CSV-Format

WOODY, Harlan Fred     S2c  USN 
WOOD, Earl A.      PVT  USAR 
WOOD, Frank      S2c  USN 
WOOD, Harold Baker     BM2c  USN 
WOOD, Horace Van     S1c  USN 
WOOD, Roy Eugene     F1c  USN 
WOOLF, Norman Bragg    CWTP  USN 
WORKMAN, Creighton Hale   F1c  USN 

Ich mag es in ein CSV-Format bekommen, wie so ... formatiert habe

Ich sehe in Python kann ich regex und/oder split verwenden, aber ich muss die Leerzeichen zwischen den Vor- und Nachnamen beibehalten. Wie Sie sehen können, ist die Anzahl der Leerzeichen zwischen den meisten Einträgen unterschiedlich und die gelegentliche Registerkarte kann ebenfalls erscheinen (denke ich).

+0

Mögliche Duplikat von [Wie alle Leerzeichen aus der Zeichenfolge strippen] (http://stackoverflow.com/questions/3739909/how-to-strip-all-whitespace -from-string) – PseudoAj

+1

Sind diese tatsächlichen Service-Mitglieder Namen? Sie sollten wahrscheinlich keine tatsächlichen Namen veröffentlichen, wenn sie es sind. – IanAuld

+0

@PseudoAj Beachten Sie, dass Lösungen von dieser Seite Whitespace von 'Harlan Fred' entfernen. – vaultah

Antwort

2

Hier ist ein Weg, es zu tun - zuerst auf ein Komma teilen und dann auf mehrere Leerzeichen aufteilen, um zu vermeiden, dass die Namen mit einfachem Abstand aufgeteilt werden. Dann verbinden Sie alle Einzelteile mit einem Komma mit str.join:

with open(textfile) as f, open(csvfile, 'w') as fc: 
    for line in f: 
     first, others = line.split(',') 
     row = [first] + [i.strip() for i in others.split(' ') if i] 
     fc.write(','.join(row) + '\n') 
0
line = 'WOODY, Harlan Fred     S2c  USN' 
print(line[:35].rstrip().split(', ') + line[35:].split()) 

Ausgang:

['WOODY', 'Harlan Fred', 'S2c', 'USN'] 
0

Verwenden pandasread_csv mit einem regex seperator. Pandas werden schneller sein als eine in reinem Python geschriebene Lösung.

import pandas as pd 
pd.read_csv('./s.dat',header=None, delimiter=r"\s+") 
      0   1  2  3  4 
0 WOODY,  Harlan Fred S2c USN 
1  WOOD,  Earl  A. PVT USAR 
2  WOOD,  Frank  S2c USN NaN 
3  WOOD,  Harold Baker BM2c USN 
4  WOOD,  Horace  Van S1c USN 
5  WOOD,  Roy Eugene F1c USN 
6 WOOLF,  Norman Bragg CWTP USN 
7 WORKMAN, Creighton Hale F1c USN 
0

Ein andere Möglichkeit, so jeden Doppelraum mit einem Komma zu ersetzen wäre zu tun, teilten Sie dann auf dem Komma, dann die Nicht-Null-Wert Strippen, schließlich mit einem Komma verbinden. Wenden Sie die folgenden auf jede Zeile in der Textdatei:

','.join([x.strip() for x in line.replace(' ',',').split(',') if x])