2016-07-15 5 views
1

Ich habe ein Skript, das Verkaufswerte in separate Zeilen in einer Datei schreibt und das ultimative Ziel ist, die Daten in einer Datenbank zu speichern. Das Problem, auf das ich stoße, ist, dass es doppelte Einträge für denselben Verkäufer, Datum, Produkt, Preis und Menge gibt.Duplikate finden, zur Variablen hinzufügen und entfernen

Mein Code ist wie folgt in die Datei geschrieben:

John 07-15-2016 Tool Belt $100 2 
Sara 07-15-2016 Hammer $100 3 
John 07-15-2016 Tool Belt $100 2 
John 07-15-2016 Tool Belt $100 2 
Sara 07-15-2016 Hammer $100 3 

Wie entferne ich die Duplikate und sie zusammen fügen? das heißt, die ausgegeben zu werden:

John 07-15-2016 Tool Belt $100 6 
Sara 07-15-2016 Hammer $100 6 

I Zähler verwendet habe, aber es mehrere Instanzen nicht fangen, noch kann ich einen Weg finden, die beiden zusammen zu fügen.

Jede Hilfe wäre willkommen.

Script:

for line in s: 
     var = re.compile(r'(\$)',re.M) 
     line = re.sub(var, "", line) 
     var = re.compile(r'(\,)',re.M) 
     line = re.sub(var, "", line) 
     line = line.rstrip('\n') 
     line = line.split("|") 
     if line[0] != '': 
      salesperson = str(salesperson) 
      date = dt.now() 
      t = line[0].split() 
      print t 
      t = str(t[0]) 
      try: 
       s = dt.strptime(t, "%H:%M:%S") 
      except: 
       s = dt.strptime(t, "%H:%M") 
      s = s.time() 
      date = dt.combine(date, s) 
      date = str(date) 
      price = line[1] 
      quantity = line[2] 
     fn.write("%s %s %s %s \n" % (salesperson, date, price, quantity)) 
    fn.close() 
+2

Wie schreiben Sie die Datei? zeige den relevanten Teil deines Skripts – Gocht

+0

@Gocht Ich habe es bearbeitet, um das Skript anzuzeigen – Dorian

+1

Sie könnten ein Wörterbuch erstellen, um die Werte zu verfolgen, während Sie die Datei lesen, und erst schreiben, wenn Sie mit der Verarbeitung Ihrer Daten fertig sind. Das Schreiben auf dem Weg erlaubt es Ihnen nicht effektiv zurück zu verfolgen. – Hobbes

Antwort

0

sample.csv

John 07-15-2016 Tool Belt $100 2 
Sara 07-15-2016 Hammer $100 3 
John 07-15-2016 Tool Belt $100 2 
John 07-15-2016 Tool Belt $100 2 
Sara 07-15-2016 Hammer $100 3 

test.py

with open("sample.csv") as inputs: 
    mydict = dict() 
    for line in inputs: 
     elements = line.strip().split() 
     key = " ".join(elements[0: len(elements) - 1]) 
     mydict[key] = mydict.get(key, 0) + int(elements[-1]) 

    # iterate the dictionary and print out result 
    for key, value in mydict.iteritems(): 
     print "{0} {1}".format(key, value) 

ein Wörterbuch verwenden, um jede Zeile geteilt und erste len(elements) - 1 Elemente als Schlüssel verwenden, und dann die letzten Elemente erhöhen, wenn iteriere alle Zeilen.

mydict.get(key, 0) kehrt Wert, wenn Schlüssel im Wörterbuch vorhanden, ansonsten Rückgabewert 0

Ergebnis: python2.7 test.py

Sara 07-15-2016 Hammer $100 6 
John 07-15-2016 Tool Belt $100 6 

daher in Ihrem Fall benötigen Sie:

elements = line.strip().split() 
key = " ".join(elements[0: len(elements) - 1]) 
mydict[key] = mydict.get(key, 0) + int(elements[-1]) 
+0

Das hat funktioniert !! Vielen Dank!! – Dorian

+0

@Dorian froh, dass es hilft :) – haifzhan

0

Ihre Dateien Angenommen wird records.txt

genannt

Um jeden Verkäufer die Datei in eine separate Datei Split:

awk '{print > $1}' records.txt

Dann spezifisch zu zählen Artikel pro Verkäufer:

cat Sara | grep 'Hammer' | awk '{print $NF,sum}' | awk '{s+=$1} END {print s}'

+0

Andere Verkäufer verkaufen Hammer, also glaube ich nicht, dass das funktionieren würde ... – Dorian

+0

@Dorian, du könntest zuerst den Verkäufer grepeln, dann bekommst du für jeden Verkäufer eine Einzelzählung. Nur ein Gedanke, um das Problem in ein kleineres Problem zu bringen. :) –