2016-10-31 1 views
-2

Ich bin sehr neu im Scripting und bin daher nicht sicher, wie ich eine Reihe von Dateien am besten zusammenführen kann. Ich versuche, ein Qualitätskontrollskript zu erstellen, das sicherstellt, dass ein nächtliches Laden ordnungsgemäß in die DB hochgeladen wurde (wir haben festgestellt, dass bei einer Verzögerung aus irgendeinem Grund die Synchronisierung jegliche Spenden ausschließt, die während des genannten Zeitraums eingingen).Dateien basierend auf einem Datumsbereich kombinieren

Ich habe ein Verzeichnis von täglich synchronisierten Dateien als solche gekennzeichnet:

20161031_donations.txt 

20161030_donations.txt 

20161029_donations.txt 

20161028_donations.txt 

etc etc 

Jede Datei denselben Header hat.

Ich möchte die letzten 7 Tage von Dateien in eine Datei mit nur 1 Kopfzeile zusammenführen. Ich bemühe mich hauptsächlich zu verstehen, wie man einen Datumsbereich mit einem Platzhalter belegt. Ich habe immer nur getan:

for i in a.txt b.txt c.txt d.txt 
do this 
done 

, die für eine statische merge in Ordnung ist, aber nicht dynamisch in eine richtige QC Skript zu integrieren.

Ich habe einen Unix-Hintergrund, aber möchte dies in Python tun. Ich bin neu in Python, also bitte erläutern Sie in irgendwelchen Vorschlägen.

+0

Stackoverflow ist kein freier Code schriftlich Service zu tun. Wenn Sie versucht haben, etwas zu schreiben und Schwierigkeiten zu haben, dann zeigen Sie, was Sie getan haben, und stellen Sie eine spezifische Frage. Siehe http://stackoverflow.com/help/how-to-ask für Tipps. Wenn Sie nur freie Arbeit erledigen wollen, ist StackOverflow nicht der richtige Ort für solche Anfragen. Lernen Sie, Ihren Code selbst zu schreiben oder jemanden zu bezahlen, um ihn für Sie zu schreiben. – ghoti

Antwort

1

Erweiterung auf Alex Hall Antwort, können Sie den Header aus einer Datei packen und es für die verbleibenden Dateien überspringen der Merge

from glob import glob 
from shutil import copyfileobj 

files = sorted(glob('*_donations.txt'))[-7:] 

# if you want most recent file first do 
# files.reverse() 

with open("merged_file.txt", "w") as outfp: 
    for i, filename in enumerate(files): 
     with open(filename) as infile: 
      if i: 
       next(infile)    # discard header 
      copyfileobj(infile, outfile) # write remaining 
+0

Ich habe die Funktion immer nur benutzt, indem ich sie etwas zugewiesen habe. Es 'myfile = open (' file.txt ' , 'wb') myfile.write ([einige SQL-Ausgabe]) ' verwendet auf diese Weise öffnen Sie die Daten in die Datei schreiben, damit ich es später in meinem Skript verwenden kann? – JayA

+0

Meinst du die' mit' Aussage? 'mit open (" merged_file.txt "," w ") als outfp:' öffnet die Datei und weist das Dateiobjekt 'outfp' zu. Es ist nützlich, da es die Datei automatisch schließt, wenn Sie die Klausel verlassen do 'myfile = open ('file.txt', 'wb')' ... aber mach 'nicht 'myfile.close() 'Daten bleiben in dieser Datei nicht gespeichert. Dieses Skript schreibt in die Datei und es wird dort auf der Festplatte sein, wenn es fertig ist. – tdelaney

1

Der Vorteil Ihres Datumsformats (unter der Annahme, dass es kein Padding gibt, z. B. 20160203 für 3. Februar) ist, dass es alphabetisch sortiert werden kann! So können Sie genau dies tun:

from glob import glob 

for path in sorted(glob('*_donations.txt'))[-7:]: 
    with open(path) as f: 
     # get the content for merging 

Dies wird die 7 neuesten Dateien erhalten, beginnend mit dem ältesten. This is why ISO 8601 is the best date format.

+0

Ich bin mir immer noch nicht sicher, wie man die Dateien tatsächlich zusammenführt. Wie würde das in Verbindung mit sed (um Headerzeilen zu entfernen) oder cat, um die Dateien zu kombinieren? – JayA

+0

Ich persönlich mag es nicht, Sprachen zu mischen. Sie haben gesagt, dass Sie eine statische Zusammenführung durchführen können, also zeigen Sie einen Versuch an. –

+0

Sicher. also würde ich normalerweise so etwas tun: 'head -1 file1.txt> headers.tmp sed -i '1d' * .txt cat headers.tmp * .txt> FINAL.txt' oder' head-1 file1.txt> headers .tmp für DATEI in Datei1 Datei2 Datei3 tue sed -i '1d' $ {DATEI} .txt >> headers.tmp erledigt 'so etwas ... aber es 1) beantwortet nicht die Datumsfrage und 2) isn' t dynamisch. Ich muss die Dateien manuell angeben, anstatt zu versuchen, es in den letzten 7 Tagen zu sehen – JayA

Verwandte Themen