2017-10-23 2 views
-1

Ich habe 2 csv-Dateien wie:2 CSV-Dateien. Wird vor und nach der Migration ausgeführt. Wollen gegen Schwelle vergleichen zählen

Format

  • REPORT_NUM, EXEC, REPORT_NAME, REPORT_COUNT

before.csv

  • 1,1, "Bericht 1", 45
  • 2,1, "Report 2", 456
  • 3,1, "Report 3", 11
  • 4,1, "Report 4", 0

after.csv

  • 1,1, "Report 1", 47
  • 2,1, "Report 2", 456556
  • 3,1, "Report 3", 0
  • 4,1, "Report 4", 212

Ich brauche im Grunde für jeden REPORT_NUM REPORT_COUNT und dann Ausgabe einer dritte csv mit REPORT_NAME, bevor REPORT_COUNT nach REPORT_COUNT zu vergleichen, wenn ein Schwellenwert Kreuz gibt es (wenn die nach ist mehr als 10% anders als vor). EXEC ist nur ein Ausführungslauf.

So Result.csv könnte zeigen:

  • 2,1 "Report 2", 456,456556
  • 3,1 "Report 3", 11,0
  • 4,1 "Report 4", 0.212

ich für Inspiration bei der folgenden Suche:

Comparing values between 2 CSV files and writing to a 3rd CSV file

Python: Comparing two CSV files and searching for similar items

Ich fahre fort zu suchen, aber jede Rückmeldung geschätzt.

Vielen Dank im Voraus!

p.s. Ich gehe davon aus, Python ist das Beste, ich habe keine Ahnung, welche Sprache, aber ich habe grundlegende Python verstehen. Ich begann diese in bash zu schreiben und „diff“ und „sed“ .. verwenden und so kann ich diesen Weg zu gehen ..

Antwort

1

Basierend auf den zwei Links, die Sie haben:

import csv 

with open('before.csv', 'r') as before: 
    before_indices = dict((i[2], i[3]) for i in csv.reader(before)) 


with open('after.csv', 'r') as reportAfter: 
    with open('results.csv', 'w') as results: 
     reader = csv.reader(reportAfter) 
     writer = csv.writer(results, quoting=csv.QUOTE_NONNUMERIC) 

     for row in reader: 
      value = before_indices.get(row[2]) 

      if float(row[3]) > 1.1*float(value) or float(row[3]) < 0.9*float(value): 
       writer.writerow([int(row[0]),int(row[1]),row[2],int(value),int(row[3])]) 

dies erzeugt die gewünschten Ausgang gegeben Ihre Beispieleingabe auf Linux. Unter Windows müssen Sie gemäß dieser Python3: writing csv files ändern.Wenn Sie nicht ganzzahlige Zahlen haben, können Sie das int() in der letzten Zeile in float() ändern, um Dezimalzahlen zu erhalten.

+0

Das ist großartig :) Nur eine kurze Frage - wenn ich die% Toleranz anpassen muss, sagen wir zu 5%, ändere ich die 1.1 und 0.9 Werte? – Gripsiden

+1

Ja, das ist richtig, bedenke auch, dass der Vergleich von sehr kleinen oder sehr großen Zahlen sorgfältig wegen der Gleitkomma-Genauigkeit erfolgen muss. – voiDnyx

+0

OOps sorry, ich dachte, ich könnte einstellen (für 5%, bis 0.6> und 0.4), aber scheint nicht der Fall zu sein .. Entschuldigung dafür, ein Dummy auf diesem einen sein. Kannst du irgendeine Anleitung geben, wie das verwendet wird? – Gripsiden

Verwandte Themen