#!/usr/bin/python ''' CompareCsv.py - Python script that will compare two CSV files based upon a unique ID field and record changes in this field as well as two secondary fields (qty & price). The output is a CSV file. ''' #Imports (do not change) from __future__ import division import sys,csv # --------------------------------------------- #Globals - CHANGE ME # ---------------------------------------------- OldFile = 'test1.csv' # File Name For Old CSV File (Front Slashes / to separate paths) NewFile = 'test2.csv' # File Name For New CSV File (Front Slashes / to separate paths) OutFile = 'test-out.csv' # File To Save Results (Front Slashes / to separate paths) CSVFilesHaveHeaderRow = True # True or False if input files include a header row IdColNumber = 0 # Column that contains the unique Item ID (Start counting with zero) QtyColNumber = 1 # Column that contains the qty in stock PriceColNumber = 2 # Column that contains the prices DefaultMarkUpPercent = 0 # Markup in percent - Needs to be whole number 0 = disable # --------------------------------------------- # Create CSV Objects CSVOld = csv.reader(open(OldFile,'rb')) CSVNew = csv.reader(open(NewFile,'rb')) CSVOut = csv.writer(open(OutFile,'wb')) CSVOut.writerow(['ID','Price','Qty','Orderable','Status']) # ----------------------------------------- # Load Old Data Into Memory OldData = {} FirstLine = True for line in CSVOld: if CSVFilesHaveHeaderRow and FirstLine: FirstLine = False else: OldData[line[IdColNumber]] = (line[QtyColNumber],line[PriceColNumber]) # ----------------------------------------- # Read Through New Data & Compare to Old NewIDList = [] FirstLine = True for line in CSVNew: # Skip Header In CSV Files if CSVFilesHaveHeaderRow and FirstLine: FirstLine = False else: # Assign New Values to locals for readability NewID = line[IdColNumber] NewQty = line[QtyColNumber] NewPrice = line[PriceColNumber] # Existing Items - Compare Secondary Fields if OldData.has_key(line[IdColNumber]): # Assign Old Values locals for readability OldID = OldData[line[IdColNumber]] OldQty = OldID = OldData[line[IdColNumber]][0] OldPrice = OldID = OldData[line[IdColNumber]][1] # Save ID Field To Test for deleted NewIDList.append(NewID) # Reset Status Status = "" # Define Current Orderable Status if NewQty == 0: Orderable = "NO" else: Orderable = "YES" # Check for Stock Status Change if int(OldQty) <= 0 and int(NewQty) > 0: Status += "In-Stock " if int(OldQty) > 0 and int(NewQty) <= 0: Status += "Out-Stock " # Check for Price Change if OldPrice != NewPrice: Status += "Price " if DefaultMarkUpPercent > 0: SellPrice = str(float(NewPrice) * (1+(DefaultMarkUpPercent / 100))) else: SellPrice = NewPrice else: SellPrice = NewPrice # Save to output only if the item has a changed status if Status: CSVOut.writerow([NewID,SellPrice,NewQty,Orderable,Status]) else: # New Item ID # Markup Price if DefaultMarkUpPercent > 0: SellPrice = str(float(NewPrice) * (1+(DefaultMarkUpPercent / 100))) else: SellPrice = NewPrice # Save to Output CSVOut.writerow([NewID,SellPrice,NewQty,'YES','NewItem']) # Check For Deleted Items for id in OldData.keys(): if id not in NewIDList: CSVOut.writerow([id,'','','NO','Deleted'])