2015-05-04 7 views
5

Ich versuche, es zu verwenden, um Daten in großen TXT-Dateien zu bearbeiten.Extrahieren von Spalten mit einem bestimmten Namen

Ich habe eine txt-Datei mit mehr als 2000 Spalten, und etwa ein Drittel davon haben einen Titel, der das Wort "Net" enthält. Ich möchte nur diese Spalten extrahieren und sie in eine neue TXT-Datei schreiben. Irgendwelche Vorschläge, wie ich das machen kann?

Ich habe ein wenig gesucht, konnte aber nichts finden, was mir hilft. Entschuldigung, wenn ähnliche Fragen schon einmal gestellt und gelöst wurden.

EDIT 1: Danke euch allen! Im Moment des Schreibens haben 3 Benutzer Lösungen vorgeschlagen und alle funktionieren sehr gut. Ich habe ehrlich gesagt nicht geglaubt, dass die Leute antworten würden, also habe ich nicht ein oder zwei Tage nachgesehen und war glücklich darüber überrascht. Ich bin sehr beeindruckt.

EDIT 2: Ich habe ein Bild hinzugefügt, dass ein Teil der ursprünglichen txt-Datei zeigt, was aussehen kann, falls es jemanden in der Zukunft helfen wird:

Sample from original txt-file

+0

Können Sie bitte eine kleine Probe Ihrer Datei mit der Frage anhängen das Problem Aussage etwas klarer zu machen? – ZdaR

+0

Sicher! Ich habe bereits Hilfe erhalten, aber ich habe jetzt ein kleines Bild von einem Beispiel des Codes eingefügt, falls es jemandem in der Zukunft helfen wird – Rickyboy

Antwort

6

Eine Möglichkeit, dies ohne die Installation von Drittanbieter-Modulen wie numpy/pandas zu tun, ist wie folgt. Gegeben eine Eingabedatei, die so genannte "input.csv" wie folgt aus:

a, b, c_net, d, e_net

0,0,1,0,1

0,0,1, 0,1

(entfernen Sie die Leerzeilen dazwischen, sie sind nur für die Formatierung der Inhalt in diesem Beitrag)

Der folgende Code tut, was Sie wollen.

import csv 


input_filename = 'input.csv' 
output_filename = 'output.csv' 

# Instantiate a CSV reader, check if you have the appropriate delimiter 
reader = csv.reader(open(input_filename), delimiter=',') 

# Get the first row (assuming this row contains the header) 
input_header = reader.next() 

# Filter out the columns that you want to keep by storing the column 
# index 
columns_to_keep = [] 
for i, name in enumerate(input_header): 
    if 'net' in name: 
     columns_to_keep.append(i) 

# Create a CSV writer to store the columns you want to keep 
writer = csv.writer(open(output_filename, 'w'), delimiter=',') 

# Construct the header of the output file 
output_header = [] 
for column_index in columns_to_keep: 
    output_header.append(input_header[column_index]) 

# Write the header to the output file 
writer.writerow(output_header) 

# Iterate of the remainder of the input file, construct a row 
# with columns you want to keep and write this row to the output file 
for row in reader: 
    new_row = [] 
    for column_index in columns_to_keep: 
     new_row.append(row[column_index]) 
    writer.writerow(new_row) 

Beachten Sie, dass keine Fehlerbehandlung erfolgt. Es gibt mindestens zwei, die behandelt werden sollten. Die erste ist die Überprüfung auf die Existenz der Eingabedatei (Hinweis: Überprüfen Sie die Funktionalität, die von den Modulen os und os.path zur Verfügung gestellt wird). Die zweite besteht darin, Leerzeilen oder Zeilen mit einer inkonsistenten Anzahl von Spalten zu behandeln.

+0

Wow vielen Dank, funktioniert wie ein Charme! Sehr beeindruckt :) – Rickyboy

4

Dies könnte getan zum Beispiel mit Pandas,

import pandas as pd 

df = pd.read_csv('path_to_file.txt', sep='\s+') 
print(df.columns) # check that the columns are parsed correctly 
selected_columns = [col for col in df.columns if "net" in col] 
df_filtered = df[selected_columns] 
df_filtered.to_csv('new_file.txt') 

natürlich, da wir denen den entsprechenden nicht die Struktur der Textdatei haben, würden Sie die Argumente von read_csv anpassen müssen, um diese Arbeit in Ihrem Fall zu machen (siehe documentation).

Dadurch wird die gesamte Datei im Arbeitsspeicher geladen und die unnötigen Spalten herausgefiltert. Wenn Ihre Datei so groß ist, dass sie nicht gleichzeitig in den Arbeitsspeicher geladen werden kann, können Sie nur bestimmte Spalten mit dem Argument usecols laden.

+0

Ordentlich! Funktioniert perfekt – Rickyboy

3

können Sie Pandas Filterfunktion verwenden, um einige Spalten auswählen, basierend auf regex

data_filtered = data.filter(regex='net') 
+0

Schön!Diese einfache Zeile funktioniert sehr gut, um die Spalten zu extrahieren, sobald die Datei gelesen wurde. Vielen Dank! – Rickyboy