2017-04-25 4 views
0

Ich habe eine Eingabedatei, die input file linkMuster passender Text in einer Datei?

und müssen wie folgt aussieht eine Ausgabedatei erstellen, die wie folgt output file link

ich mit diesem aber die Fehlerbehandlung und Pattern-Matching wird vermasselt die Logik gestartet sieht (besonders das Vorkommen von: in URL sowie die Daten). Auch ist der Durchschnitt in der Ausgabedatei Durchschnitt über die nicht null oder nicht null-Wert

with open("input.txt") as f: 
next(f) # skips header 
for line in f: 

    cleanline = re.sub('::',':',line) # handles the two :: case 
    newline = re.split("[\t:]",cleanline) #splits on either tab or : 
    print newline 
    x=0 
    total=0 
    for i in range(3,7): 
    if newline[i] <> 0 or newline[i] != None: 
     x+=1 
     total+=total 
     avg=total/x 
     print avg 
+0

Ich würde empfehlen, mit dem 'csv' Modul die Dateien zu lesen und zu schreiben. Es kann viel von dem speziellen Fall für Ihr behandeln. Schlagen Sie auch vor, dass Sie Ihre Frage bearbeiten und ein langes Beispiel einer Eingabedatei mit allen Sonderfällen sowie die erwartete Ausgabe anzeigen. – martineau

+0

Ich habe Bilder von Eingabe- und Ausgabedateien hinzugefügt, um zu erklären, was ich besser machen möchte. Danke, dass du das vorgeschlagen hast. Der Beitrag war zu verwirrend – ashu138

+0

Eigentlich wollte ich, dass Sie Zeilen aus beiden Dateien ausschneiden und in Ihre Frage einfügen (eingerückt mit 4 Leerzeichen). Auf diese Weise könnte jemand den ersten verwenden, um den Code ausführen zu können, und der zweite, um die Ergebnisse zu überprüfen. – martineau

Antwort

0

Ich würde vorschlagen, dass Sie diese aus einem anderen Blickwinkel nähern. Teilen Sie zuerst jede Zeile auf den Registerkarten auf und validieren Sie dann jeden Eintrag einzeln. Auf diese Weise können Sie für jeden Eintrag einen regulären Ausdruck kompilieren und genauere Fehlermeldungen kompilieren. Eine gute Möglichkeit, dies zu tun ist mit Tupel auspacken und Split-Methode:

from __future__ import print_function 

with open("input.txt") as in_file, open("output.txt", 'w') as out_file: 
    next(in_file) # skips header 

    for line in in_file: 
     error_message = [] 
     # remove line break character and split along the tabs 
     id_and_date, user_id, p1, p2, p3, p4, url = line.strip("\n").split("\t") 

     # split the first entry at the first : 
     split_id_date = id_and_date.split(":", 1) 
     if len(split_id_date) == 2: 
      order_id, date = split_id_date 
     elif len(split_id_date) == 1: 
      # assume this is the order id 
      # or do something 
      order_id, date = (split_id_date[0], "") 
      error_message.append("Invalid Date") 
     else: 
      # set default values if nothing is present 
      order_id, date = ("", "") 
     # validate order_id and date here using re.match 
     # add errors to error_message list: 
     # error_message.append("Invalid Date") 

     # calculate average price 
     # first, compile a list of the non-zero prices 
     nonzero_prices = [int(x) for x in (p1, p2, p3, p4) if int(x) > 0] # this can be done more efficient 
     # compute the average price 
     avg_price = sum(nonzero_prices)/len(nonzero_prices) 

     # validate url using re here 
     # handle errors as above 

     print("\t".join([order_id, date, user_id, str(avg_price), url, ", ".join(error_message)]), file=out_file) 

ich nicht die re Anrufe hinzufügen, um die Eingaben zu bestätigen, da ich nicht weiß, was genau Sie in den Einträgen zu sehen erwarten. Allerdings habe ich einen Kommentar hinzugefügt, wo der Anruf zu re.match oder etwas Ähnliches sinnvoll wäre.

Ich hoffe, das hilft.

Verwandte Themen