2016-06-06 11 views
1

Es gibt eine große Datei mit festem Format, Datei1. Eine weitere CSV-Datei, Datei2 hat IDs und Werte, mit denen bestimmte Teile eines Datensatzes mit derselben ID in Datei1 aktualisiert werden müssen. Hier ist mein Versuch. Ich freue mich über jede Hilfe, die Sie anbieten können, damit dies funktioniert.Datensätze in Datei2 mit Daten in Datei1 aktualisieren

file2 Komma getrennt

clr,code,type 
Red,1001,1 
Red,2001,2 
Red,3001,3 
blu,1002,1 
blu,2002,2 
blu,3002,3 

file1 (feste Breite-Format)

clrtyp1typ2typ3notes 
red110121013101helloworld 
blu110221023102helloworld2 

die file1 müssen folgende

clrtyp1typ2typ3notes 
red100120013001helloworld 
blu100220023002helloworld2 

aktualisiert werden, bitte beachten Sie, dass sowohl die Dateien ziemlich große Dateien (jeweils mehrere GB). Ich bin Python Noob, bitte entschuldigen Sie grobe Fehler. Ich würde wirklich jede Hilfe schätzen, die Sie anbieten könnten.

import shutil 
#read both input files 
file1=open("file1.txt",'r').read() 
file2='file2.txt' 

#make a copy of the input file to make edits to it. 
file2Edit=file2+'.EDIT' 
shutil.copy(file2, baseEdit) 
baseEditFile = open(baseEdit,'w').read() 

#go thru eachline, pick clr from file1 and look for it in file2, if found, form a string to be replaced and replace the original line. 
with open('file2.txt','w') as f: 
    for line in f: 
     base_clr = line[:3] 
     findindex = file1.find(base_recid) 
     if findindex != -1: 
      for line2 in file1: 
       #print(line) 
       clr = line2.split(",")[0] 
       code = line2.split(",")[1] 
       type = line2.split(",")[2] 
       if keytype = 1: 
        finalline=line[:15]+string.rjust(keyid, 15)+line[30:] 
        baseEditFile.write(replace(line,finalline) 
        baseEditFile.replace(line,finalline) 
+0

Was funktioniert im Moment nicht? Funktioniert es aber langsam? –

+0

@SimonFraser Das Skript ist nicht vollständig. Ich stecke im Wesentlichen fest und konnte mich im letzten Stück nicht vorwärts bewegen. – sch

Antwort

2

Wenn ich Sie recht verstehe, müssen Sie etwas wie folgt aus:

# declare file names and necessary lists 
file1 = "file1.txt" 
file2 = "file2.txt" 
file1_new = "file1.txt.EDIT" 
clrs = {} 

# read clrs to update 
with open(file1, "r") as f: 
    # skip header line 
    f.next() 
    for line in f: 
     clrs[line[:3]] = [] 

# read the new codes 
with open(file2, "r") as f: 
    # skip header 
    f.next() 
    for line in f: 
     current = line.strip().split(",") 
     key = current[0].lower() 
     if key in clrs: 
      clrs[key].append(current[1]) 

# write the new lines (old codes replaced with the new ones) to new file 
with open(file1, "r") as f_in: 
    with open(file1_new, "w") as f_out: 
     # writes header 
     f_out.write(f_in.next()) 
     for line in f_in: 
      line_new = list(line) 
      key = line[:3] 
      # checks if new codes were found for that key 
      if key in clrs.keys(): 
       # replaces old keys by the new keys 
       line_new[3:15] = "".join(clrs[key]) 
      f_out.write("".join(line_new)) 

Diese nur für das gegebene Beispiel funktioniert. Wenn Ihre Datei tatsächlich ein anderes Format verwendet, müssen Sie die verwendeten Indizes anpassen.

Dieses kleine Skript öffnet zuerst Ihre Datei1, iteriert darüber und fügt die CLR als Schlüssel zu einem Wörterbuch hinzu. Der Wert für diesen Schlüssel ist eine leere Liste. Dann öffnet es Datei2 und iteriert hier über jede clr. Wenn sich die clr im Wörterbuch befindet, hängt sie den Code an die Liste an. Nach dem Ausführen dieses Teils enthält das Wörterbuch Schlüssel, Wertpaare, wobei die Schlüssel die clr-Werte und die Werte Listen mit den Codes sind (in der Reihenfolge, die von der Datei angegeben wurde).

Und im letzten Teil des Skripts wird jede Zeile von file1.txt in file1.txt.EDIT geschrieben. Vor dem Schreiben werden die alten Codes durch die neuen ersetzt.

Die in file2.txt gespeicherten Codes müssen in der gleichen Reihenfolge wie in file1.txt gespeichert sein. Wenn die Reihenfolge anders sein kann oder die Möglichkeit besteht, dass in Datei2.txt mehr Codes vorhanden sind, als in Datei1.txt ersetzt werden müssen, müssen Sie eine Abfrage hinzufügen, um nach den korrekten Codes zu suchen. Das ist kein großes Geschäft, aber dieses Skript löst Ihr Problem für die Dateien, die Sie uns als Beispiel gegeben haben.

Wenn Sie Fragen haben oder weitere Hilfe benötigen, zögern Sie nicht zu fragen.

EDIT: Abgesehen von einigen syntaktischen Fehlern und falschen Methodenaufrufen, die Sie im Code Ihrer Frage gemacht haben, sollten Sie nicht alle in einer Datei gespeicherten Daten gleichzeitig einlesen, besonders wenn Sie wissen, dass die Dateien sehr groß werden können. Dies verbraucht viel Speicher und kann dazu führen, dass das Programm sehr langsam läuft. Deshalb ist es viel besser, Zeile für Zeile zu iterieren. Das von mir bereitgestellte Beispiel liest nur eine Zeile der Datei auf einmal und schreibt sie direkt in die neue Datei, anstatt die alten Dateien und die neue Datei im Speicher zu speichern und sie als letzten Schritt zu schreiben.

+0

Nur für eine Ebene der Einrückung können Sie 'mit öffnen (file1," r ") als f_in, öffnen (file1_new," w ") als f_out:' –

+0

Absolut richtig, ich dachte nur so ist es besser zu verstehen was ich für Anfänger meinte. – TobiasTomski

+0

Verstanden!Ich frage mich, ob das OP mit einem Hash irgendeiner Art, SQL-Datenbank vielleicht besser wäre. Wahrscheinlich außerhalb der Reichweite der Frage, obwohl –

Verwandte Themen