def read(fName):
		Log.trace(__class__, "read()")
		pCollection = PersonCollection()
		try:
			file = open(fName, 'r')
			isHeader = True
			#SEP = ',*'
			SEP = "[\,,\s]*"
			EMB = "\""
			regEx = re.compile(EMB + '([^' + EMB + ']*)' + EMB + SEP)
			for line in file:
				i = 0
				person = Person()
				for col in regEx.findall(line):
					if(isHeader):
						pCollection.addHeader(col)
						#self._headerNames.append(col)
					else:
						person.setAttribute(pCollection.getHeaderNames()[i], col)
						i += 1 
				if(isHeader):
					isHeader = False
				else:
					pCollection.addPerson(person)
					
			file.close()
			return pCollection
		except IOError:
			Log.error(__class__, "IOError with file > " + fName)
			return None
	def _merge(pcMerge, pcMaster, pcSlave):
		Log.trace(__class__, "_merge() called")
		# add headerNames in pcNew
		for kMaster in pcMaster.getHeaderNames():
			pcMerge.addHeader(kMaster)
		# Merge attributes of pcMaster to pcNew
		for pMaster in pcMaster.getPersons():
			pMerge = Merge.getPerson(pcMerge, pMaster)
			if(pMerge == None):
				pMerge = Person()
				pcMerge.addPerson(pMerge)
			pSlave = Merge.getPerson(pcSlave, pMaster)
			if(pSlave == None):
				# do copy of pMaster
				pSlave = Person()
			for kMaster in pcMaster.getHeaderNames():
				aMaster = pMaster.getAttribute(kMaster)
				aSlave = pSlave.getAttribute(kMaster)
				aMerge = Person.ATTR_NOT_AVAILABLE
				# Attribute is empty
				if((aMaster != "" or aMaster != Person.ATTR_NOT_AVAILABLE) and (aSlave == "" or aSlave == Person.ATTR_NOT_AVAILABLE)):
					aMerge = aMaster
				elif((aSlave != "" or aSlave != Person.ATTR_NOT_AVAILABLE) and (aMaster == "" or aMaster == Person.ATTR_NOT_AVAILABLE)):
					aMerge = aSlave
				# Attributes are not empty
				elif(aMaster == aSlave):
					aMerge = aMaster
				else:
					Log.warn(__class__, "merge conflict:\nMaster=" + aMaster + "\n Slave=" + aSlave)
				pMerge.setAttribute(kMaster, aMerge)
		Log.trace(__class__, "_merge() finished")
	def doMapping(self, pcSrc):
		pcDest = PersonCollection()
		# add headerNames to destination personCollection
		for kDest in self._mapping.values():
			pcDest.addHeader(kDest)
		# add srcPersons to destPersons with new headerNames
		for pSrc in pcSrc.getPersons():
			pDest = Person()
			for kSrc, kDest in self._mapping.items():
				attr = pSrc.getAttribute(kSrc)
				if((attr == Person.ATTR_NOT_AVAILABLE  or attr == "") and self._defaultValues[kDest] != ""):
					attr = self._defaultValues[kDest]
				pDest.setAttribute(kDest, attr)
			pcDest.addPerson(pDest)
		return pcDest