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.
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
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
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