2016-10-17 5 views
-1

Jede Empfehlung, wie ich Daten aus mehreren Textdateien erfassen und verarbeiten kann (zB Summen berechnen). Ich habe versucht, es in Python zu tun, aber weiterhin Sackgassen.Daten aus mehreren Textdateien verarbeiten

Ein Computer generiert bei jeder Operation eine Übersichtsdatei im Textformat. In diesem Beispiel werden gute Äpfel aus Chargen gescannt. Zuerst lädst du die Äpfel, dann wird gut von schlecht getrennt, und dann kannst du die schlechten Äpfel erneut laden, um sie erneut zu testen, und einige werden wiedergewonnen. Es werden also mindestens 2 Übersichtsdateien pro Batch erstellt, abhängig davon, wie oft Sie die Äpfel laden, um sie wiederherzustellen.

Dies ist ein Beispiel für die Textdatei:

file1:

general Info: 
    Batch No.  : A2J3 
    Operation  : Test 
    Fruit   : Apple 
    Operation Number : A5500 
    Quantity In  : 10 
yield info: 
    S1 S2  Total Bin Name 
    5 2  7  good 
    1 2  3  bad 

file2:

general Info: 
    Batch No.  : A2J3 
    Operation  : Test 
    Fruit   : Apple 
    Operation Number : A5500 
    Quantity In  : 3 
yield info: 
    S1 S2  Total Bin Name 
    1 1  2  good 
    0 0  1  bad 

Ich möchte die Daten in einem Ordner voll von diesen txt-Dateien erhalten und Zusammenführen der Testergebnisse mit den folgenden Kriterien:

  1. Prozess der gleichen Charge durch die Identifizierung, die TXT-Dateien aus der gleichen Charge Nr kommen, gleiche Operation (basierend auf den Inhalt der txt-Datei nicht Dateiname)

  2. die 2 (oder mehr Zusammenfassungsdatei) Daten in den folgenden fusionieren Format csv:

    Lot: 
    Operation: 
    Bin  First Pass Second Pass Final Yield %Yield 
    Good  7   2   9   90% 
    Bad  3   1   1   10% 
    

S1, S2 ist variabel, kann es 1 bis 14 gehen, aber nie weniger als 1 Die Behälter können auch verschiedene Arten auf verschiedenen Textdateien (nicht nur auf gute begrenzt und schlecht. aber es wird immer nur ein gutes ist sein)

Bins: 
Good 
Semi-bad 
Bad 
Worst 
... 

Ich bin neu in Python und ich nur diese Skriptsprache in der Schule verwendet, ich weiß nur die Grundlagen, nicht mehr. Also diese Aufgabe, die ich tun möchte, ist ein wenig überwältigend mir so die Daten einer einzelnen Textdatei zu verarbeiten und bekomme ich wollte, zum Beispiel begann ich: Chargennummer

with open('R0.txt') as fh_d10SunFile: 
    fh_d10SumFile_perline = fh_d10SunFile.read().splitlines() 
    #print fh_d10SumFile_perline 

TestProgramName_str = fh_d10SumFile_perline[CONST.TestProgram_field].split(':')[1] 
LotNumber_str  = fh_d10SumFile_perline[CONST.LotNumber_field].split(':')[1] 
QtyIn_int   = int(fh_d10SumFile_perline[CONST.UnitsIn_field].split(':')[1]) 
TestIteration_str = fh_d10SumFile_perline[CONST.TestIteration_field].split(':')[1] 
TestType_str  = fh_d10SumFile_perline[CONST.TestType_field].split(':')[1] 

dann greifen alle Bins in dieser Übersichtsdatei :

SoftBins_str = filter(lambda x: re.search(r'bin',x),fh_d10SumFile_perline) 
for index in range(len(SoftBins_str)): 
    SoftBins_data_str = [l.strip() for l in SoftBins_str[index].split(' ') if l.strip()] 
    SoftBins_data_str.reverse() 
    bin2bin[SoftBins_data_str[0]] = SoftBins_data_str[2] 

dann habe ich stecken, weil ich nicht sicher bin, wie diese Lesung zu tun und mit mehreren n Anzahl von Textdateien mit n Anzahl der Standorte (S1, S2) Parsen. Wie greife ich diese Informationen aus n Anzahl der Textdateien, verarbeiten sie im Speicher (ist dies sogar mit Python möglich) und schreiben Sie dann die Ausgabe mit Berechnung in der CSV-Ausgabedatei.

+0

Sie sagen ** mindestens zwei zusammenfassende Dateien **, aber das Ausgabeformat ist bei zwei Durchgängen fixiert? Auch ich nehme an "Lot:' ist die aktuelle 'Batch-Nr." Und 'Operation:' ist 'Test'? –

+0

@MartinEvans ja, das ist richtig –

+0

@SreejithMenon aktualisiert die Frage mit mehr Details und der Ansatz, den ich versucht habe zu tun. –

Antwort

1

Folgendes sollte Ihnen den Einstieg erleichtern. Da Ihre Textdateien ein festes Format haben, ist es relativ einfach, sie einzulesen und zu parsen. Dieses Skript sucht nach allen Textdateien im aktuellen Ordner, liest jede Datei ein und speichert die Stapel in einem Wörterbuch basierend auf dem Stapelnamen, sodass alle Stapel desselben Namensbereichs gruppiert werden.

Nachdem alle Dateien verarbeitet wurden, erstellt sie Zusammenfassungen für jeden Stapel und schreibt sie in eine einzelne CSV-Ausgabedatei.

from collections import defaultdict 
import glob 
import csv 

batches = defaultdict(list) 

for text_file in glob.glob('*.txt'): 
    with open(text_file) as f_input: 
     rows = [row.strip() for row in f_input] 

    header = [rows[x].split(':')[1].strip() for x in range(1, 6)] 
    bins = {} 

    for yield_info in rows[8:]: 
     s1, s2, total, bin_name = yield_info.split() 
     bins[bin_name] = [int(s1), int(s2), int(total)] 

    batches[header[0]].append(header + [bins]) 


with open('output.csv', 'wb') as f_output: 
    csv_output = csv.writer(f_output, delimiter='\t') 

    for batch, passes in batches.items(): 
     bins_output = defaultdict(lambda: [[], 0]) 
     total_yield = 0 

     for lot, operation, fruit, op_num, quantity, bins in passes: 
      for bin_name, (s1, s2, total) in bins.iteritems(): 
       bins_output[bin_name][0].append(total) 
       bins_output[bin_name][1] += total 
       total_yield += total 

     csv_output.writerows([['Lot:', lot], ['Operation:', operation]]) 
     csv_header = ["Bin"] + ['Pass {}'.format(x) for x in range(1, 1 + len(passes))] + ["Final Yield", "%Yield"]   
     csv_output.writerow(csv_header) 

     for bin_name in sorted(bins_output.keys()): 
      entries, total = bins_output[bin_name] 
      percentage_yield = '{:.1f}%'.format((100.0 * total)/total_yield) 
      csv_output.writerow([bin_name] + entries + [total, percentage_yield]) 

     csv_output.writerow([])  # empty row to separate batches 

Sie eine Registerkarte Geben begrenzt csv Datei wie folgt:

Lot: A2J3 
Operation: Test 
Bin Pass 1 Pass 2 Final Yield %Yield 
Bad 3 1 4 30.8% 
Good 7 2 9 69.2% 

Hinweis, Skript wurde aktualisiert, mit einer beliebigen Anzahl von bin Typen zu behandeln.

Verwandte Themen