@Ayman: Yes if there are added/deleted lines. Remember that each row is identified by the value of its first field (it's unique).
Here's my code. It could use a lot of polishing and can be simplified some more as well. As usual, I'm looking for comments and feedback, so please, be harsh.
import collections
import csv
import sys
class P_SIC(dict):
fieldnames = ["name", "incond", "outcond"]
def __init__(self, input):
map(self.readline, csv.DictReader(input, self.fieldnames, delimiter=";",\
skipinitialspace=True))
def readline(self, line):
self[line["name"]] = line
def get_elem(self, name):
for i in self:
if i == name:
return self[i]
class Change:
def __init__(self, *args):
self.args=args
def echo(self):
print "\t".join(self.args)
class P_Comparator(collections.Counter):
def __init__(self, in_psic, out_psic):
self.change_list = []
self.in_psic = in_psic
self.out_psic = out_psic
self.readfile(in_psic, 1)
self.readfile(out_psic, -1)
def readfile(self, file, factor):
for key in file:
self[key] += factor
def scant(self):
for i in self:
if self[i] == -1:
self.change_list.append(Change("ADD", i))
elif self[i] == 1:
self.change_list.append(Change("DELETE", i))
else: # element exists in two files. Check if modified
j = J_Comparator(self.in_psic.get_elem(i), self.out_psic.get_elem(i))
if len(j) > 0:
self.change_list += j
class J_Comparator(list):
def __init__(self, indict, outdict):
for i in indict:
if indict[i] != outdict[i]:
self.append(Change("MODIFY", indict["name"], i, indict[i], "BECOMES", outdict[i]))
if len(self) == 0:
self = None
p = P_Comparator(P_SIC(open(sys.argv[1], "rb")), P_SIC(open(sys.argv[2], "rb")))
p.scant()
print "{} changes".format(len(p.change_list))
[c.echo() for c in p.change_list]