diff --git a/csv_functions.json b/csv_functions.json index eedbbac..dc258df 100644 --- a/csv_functions.json +++ b/csv_functions.json @@ -1,221 +1,221 @@ { - "GARBAGE_VALUES": [ - "NULL" - ], - "ORGANIZATION_TOKENS": [ - "AND", - "THE", - "AG", - "SA", - "CO", - "LIMITED", - "LTD", - "INC", - "COMPANY", - "CORP", - "CORPORATION", - "CORPORATIONS", - "CORPORATE", - "GROUP", - "TRUSTEES", - "TRUSTEE", - "TRUST", - "NOMINEES", - "ASSETS", - "ENTERPRISES", - "WORLDWIDE", - "SERVICES", - "HOLDING", - "HOLDINGS", - "INVESTMENT", - "INVESTMENTS", - "INTERNATIONAL", - "FOUNDATION", - "FINANCE", - "BANK", - "PROPERTIES", - "HOSPITAL", - "CLINIC" - ], - "PERSON_TOKENS": [ - "MR", - "MRS", - "MS", - "MISS", - "DR", - "MD", - "PHD" - ], - "SENZING_ATTRIBUTES": [ - "DATA_SOURCE", - "ROUTE_CODE", - "RECORD_ID", - "ENTITY_TYPE", - "ENTITY_KEY", - "LOAD_ID", - "DSRC_ACTION", - "NAME_TYPE", - "NAME_FULL", - "NAME_ORG", - "NAME_LAST", - "NAME_FIRST", - "NAME_MIDDLE", - "NAME_PREFIX", - "NAME_SUFFIX", - "NAME_GEN", - "GENDER", - "DOB_PREHASHED", - "DATE_OF_BIRTH", - "DOB_YEAR", - "DOB_MONTH", - "DOB_DAY", - "DOB_HASH", - "NATIONALITY_PREHASHED", - "NATIONALITY", - "CITIZENSHIP_PREHASHED", - "CITIZENSHIP", - "PHYSICAL_PREHASHED", - "PHYSICAL_TYPE", - "PHYSICAL_VALUE", - "DOD_PREHASHED", - "DATE_OF_DEATH", - "DOD_YEAR", - "DOD_MONTH", - "DOD_DAY", - "DOD_HASH", - "ACCOUNT_PREHASHED", - "ACCOUNT_NUMBER", - "ACCOUNT_DOMAIN", - "PASSPORT_PREHASHED", - "PASSPORT_NUMBER", - "PASSPORT_COUNTRY", - "PASSPORT_ISSUE_DT", - "PASSPORT_EXPIRE_DT", - "PASSPORT_NUMSTD", - "DRLIC_PREHASHED", - "DRIVERS_LICENSE_NUMBER", - "DRIVERS_LICENSE_STATE", - "DRIVERS_LICENSE_ISSUE_DT", - "DRIVERS_LICENSE_EXPIRE_DT", - "DRLIC_NUMSTD", - "SSN_PREHASHED", - "SSN_NUMBER", - "SSN_NUMSTD", - "SSN_LAST4_PREHASHED", - "SSN_LAST4", - "NATIONAL_ID_PREHASHED", - "NATIONAL_ID_NUMBER", - "NATIONAL_ID_COUNTRY", - "NATIONAL_ID_ISSUE_DT", - "NATIONAL_ID_EXPIRE_DT", - "NATIONAL_ID_NUM_STD", - "TAX_ID_PREHASHED", - "TAX_ID_NUMBER", - "TAX_ID_COUNTRY", - "TAX_ID_ISSUE_DT", - "TAX_ID_EXPIRE_DT", - "TAX_ID_NUM_STD", - "OTHER_ID_PREHASHED", - "OTHER_ID_TYPE", - "OTHER_ID_NUMBER", - "OTHER_ID_COUNTRY", - "OTHER_ID_ISSUE_DT", - "OTHER_ID_EXPIRE_DT", - "OTHER_ID_NUM_STD", - "TRUSTED_ID_PREHASHED", - "TRUSTED_ID_TYPE", - "TRUSTED_ID_NUMBER", - "WEBSITE_PREHASHED", - "WEBSITE_ADDRESS", - "EMAIL_PREHASHED", - "EMAIL_ADDRESS", - "EMAIL_TYPE", - "EMAIL_FROM_DATE", - "EMAIL_THRU_DATE", - "SOCIAL_PREHASHED", - "SOCIAL_NETWORK", - "SOCIAL_HANDLE", - "SOCIAL_FROM_DATE", - "SOCIAL_THRU_DATE", - "ADDRESS_PREHASHED", - "ADDR_FULL", - "ADDR_LINE1", - "ADDR_LINE2", - "ADDR_LINE3", - "ADDR_LINE4", - "ADDR_LINE5", - "ADDR_LINE6", - "ADDR_CITY", - "ADDR_STATE", - "ADDR_POSTAL_CODE", - "ADDR_COUNTRY", - "ADDR_STR_NUM", - "ADDR_STR_NAME", - "ADDR_UNIT_TYPE", - "ADDR_UNIT_NUM", - "ADDR_STR_NAME_METAPHONE", - "ADDR_CITY_METAPHONE", - "ADDR_STR_NAME_STD", - "ADDR_CITY_STD", - "ADDR_POSTAL_5", - "ADDR_SCRIPT", - "ADDR_LIBPOSTAL_PARSE", - "ADDR_TYPE", - "ADDR_FROM_DATE", - "ADDR_THRU_DATE", - "PHONE_PREHASHED", - "PHONE_AREACODE", - "PHONE_NUMBER", - "PHONE_EXT", - "PHONE_LAST_10", - "PHONE_LAST_5", - "PHONE_TYPE", - "PHONE_FROM_DATE", - "PHONE_THRU_DATE", - "RELATIONSHIP_TYPE", - "RELATIONSHIP_ROLE", - "RELATIONSHIP_KEY", - "RELATED_FROM_DATE", - "RELATED_THRU_DATE", - "GEO_LATLONG", - "GEO_LATITUDE", - "GEO_LONGITUDE", - "GEO_PRECISION", - "GROUP_ASSOCIATION_PREHASHED", - "GROUP_ASSOCIATION_TYPE", - "GROUP_ASSOCIATION_ORG_NAME", - "VEHICLE_LICENSE_PLATE_NUMBER", - "VEHICLE_LICENSE_PLATE_STATE", - "VEHICLE_VIN_NUMBER", - "EMPLOYER_TYPE", - "EMPLOYER", - "LINKEDIN", - "FACEBOOK", - "TWITTER", - "SKYPE", - "ZOOMROOM", - "INSTAGRAM", - "WHATSAPP", - "SIGNAL", - "TELEGRAM", - "TANGO", - "VIBER", - "WECHAT", - "RECORD_TYPE", - "PLACE_OF_BIRTH", - "REGISTRATION_DATE", - "REGISTRATION_COUNTRY", - "GROUP_ASSN_ID_TYPE", - "GROUP_ASSN_ID_NUMBER", - "DUNS_NUMBER", - "NPI_NUMBER", - "LEI_NUMBER", - "CK_NAME_DOB_COUNTRY", - "CK_NAME_DOB", - "CK_NAME_COUNTRY", - "CK_NAME_GROUPNAME", - "CK_NAME_GROUPID", - "COUNTRY_OF_ASSOCIATION", - "MOBILE_AD_ID" - ] + "GARBAGE_VALUES": [ + "NULL" + ], + "ORGANIZATION_TOKENS": [ + "AG", + "AND", + "ASSETS", + "BANK", + "CLINIC", + "CO", + "COMPANY", + "CORP", + "CORPORATE", + "CORPORATION", + "CORPORATIONS", + "ENTERPRISES", + "FINANCE", + "FOUNDATION", + "GROUP", + "HOLDING", + "HOLDINGS", + "HOSPITAL", + "INC", + "INTERNATIONAL", + "INVESTMENT", + "INVESTMENTS", + "LIMITED", + "LTD", + "NOMINEES", + "PROPERTIES", + "SA", + "SERVICES", + "THE", + "TRUST", + "TRUSTEE", + "TRUSTEES", + "WORLDWIDE" + ], + "PERSON_TOKENS": [ + "DR", + "MD", + "MISS", + "MR", + "MRS", + "MS", + "PHD" + ], + "SENZING_ATTRIBUTES": [ + "ACCOUNT_DOMAIN", + "ACCOUNT_NUMBER", + "ACCOUNT_PREHASHED", + "ADDRESS_PREHASHED", + "ADDR_CITY", + "ADDR_CITY_METAPHONE", + "ADDR_CITY_STD", + "ADDR_COUNTRY", + "ADDR_FROM_DATE", + "ADDR_FULL", + "ADDR_LIBPOSTAL_PARSE", + "ADDR_LINE1", + "ADDR_LINE2", + "ADDR_LINE3", + "ADDR_LINE4", + "ADDR_LINE5", + "ADDR_LINE6", + "ADDR_POSTAL_5", + "ADDR_POSTAL_CODE", + "ADDR_SCRIPT", + "ADDR_STATE", + "ADDR_STR_NAME", + "ADDR_STR_NAME_METAPHONE", + "ADDR_STR_NAME_STD", + "ADDR_STR_NUM", + "ADDR_THRU_DATE", + "ADDR_TYPE", + "ADDR_UNIT_NUM", + "ADDR_UNIT_TYPE", + "CITIZENSHIP", + "CITIZENSHIP_PREHASHED", + "CK_NAME_COUNTRY", + "CK_NAME_DOB", + "CK_NAME_DOB_COUNTRY", + "CK_NAME_GROUPID", + "CK_NAME_GROUPNAME", + "COUNTRY_OF_ASSOCIATION", + "DATA_SOURCE", + "DATE_OF_BIRTH", + "DATE_OF_DEATH", + "DOB_DAY", + "DOB_HASH", + "DOB_MONTH", + "DOB_PREHASHED", + "DOB_YEAR", + "DOD_DAY", + "DOD_HASH", + "DOD_MONTH", + "DOD_PREHASHED", + "DOD_YEAR", + "DRIVERS_LICENSE_EXPIRE_DT", + "DRIVERS_LICENSE_ISSUE_DT", + "DRIVERS_LICENSE_NUMBER", + "DRIVERS_LICENSE_STATE", + "DRLIC_NUMSTD", + "DRLIC_PREHASHED", + "DSRC_ACTION", + "DUNS_NUMBER", + "EMAIL_ADDRESS", + "EMAIL_FROM_DATE", + "EMAIL_PREHASHED", + "EMAIL_THRU_DATE", + "EMAIL_TYPE", + "EMPLOYER", + "EMPLOYER_TYPE", + "ENTITY_KEY", + "ENTITY_TYPE", + "FACEBOOK", + "GENDER", + "GEO_LATITUDE", + "GEO_LATLONG", + "GEO_LONGITUDE", + "GEO_PRECISION", + "GROUP_ASSN_ID_NUMBER", + "GROUP_ASSN_ID_TYPE", + "GROUP_ASSOCIATION_ORG_NAME", + "GROUP_ASSOCIATION_PREHASHED", + "GROUP_ASSOCIATION_TYPE", + "INSTAGRAM", + "LEI_NUMBER", + "LINKEDIN", + "LOAD_ID", + "MOBILE_AD_ID", + "NAME_FIRST", + "NAME_FULL", + "NAME_GEN", + "NAME_LAST", + "NAME_MIDDLE", + "NAME_ORG", + "NAME_PREFIX", + "NAME_SUFFIX", + "NAME_TYPE", + "NATIONALITY", + "NATIONALITY_PREHASHED", + "NATIONAL_ID_COUNTRY", + "NATIONAL_ID_EXPIRE_DT", + "NATIONAL_ID_ISSUE_DT", + "NATIONAL_ID_NUMBER", + "NATIONAL_ID_NUM_STD", + "NATIONAL_ID_PREHASHED", + "NPI_NUMBER", + "OTHER_ID_COUNTRY", + "OTHER_ID_EXPIRE_DT", + "OTHER_ID_ISSUE_DT", + "OTHER_ID_NUMBER", + "OTHER_ID_NUM_STD", + "OTHER_ID_PREHASHED", + "OTHER_ID_TYPE", + "PASSPORT_COUNTRY", + "PASSPORT_EXPIRE_DT", + "PASSPORT_ISSUE_DT", + "PASSPORT_NUMBER", + "PASSPORT_NUMSTD", + "PASSPORT_PREHASHED", + "PHONE_AREACODE", + "PHONE_EXT", + "PHONE_FROM_DATE", + "PHONE_LAST_10", + "PHONE_LAST_5", + "PHONE_NUMBER", + "PHONE_PREHASHED", + "PHONE_THRU_DATE", + "PHONE_TYPE", + "PHYSICAL_PREHASHED", + "PHYSICAL_TYPE", + "PHYSICAL_VALUE", + "PLACE_OF_BIRTH", + "RECORD_ID", + "RECORD_TYPE", + "REGISTRATION_COUNTRY", + "REGISTRATION_DATE", + "RELATED_FROM_DATE", + "RELATED_THRU_DATE", + "RELATIONSHIP_KEY", + "RELATIONSHIP_ROLE", + "RELATIONSHIP_TYPE", + "ROUTE_CODE", + "SIGNAL", + "SKYPE", + "SOCIAL_FROM_DATE", + "SOCIAL_HANDLE", + "SOCIAL_NETWORK", + "SOCIAL_PREHASHED", + "SOCIAL_THRU_DATE", + "SSN_LAST4", + "SSN_LAST4_PREHASHED", + "SSN_NUMBER", + "SSN_NUMSTD", + "SSN_PREHASHED", + "TANGO", + "TAX_ID_COUNTRY", + "TAX_ID_EXPIRE_DT", + "TAX_ID_ISSUE_DT", + "TAX_ID_NUMBER", + "TAX_ID_NUM_STD", + "TAX_ID_PREHASHED", + "TELEGRAM", + "TRUSTED_ID_NUMBER", + "TRUSTED_ID_PREHASHED", + "TRUSTED_ID_TYPE", + "TWITTER", + "VEHICLE_LICENSE_PLATE_NUMBER", + "VEHICLE_LICENSE_PLATE_STATE", + "VEHICLE_VIN_NUMBER", + "VIBER", + "WEBSITE_ADDRESS", + "WEBSITE_PREHASHED", + "WECHAT", + "WHATSAPP", + "ZOOMROOM" + ] } \ No newline at end of file diff --git a/csv_functions.py b/csv_functions.py index 16d4d94..48f5a7a 100644 --- a/csv_functions.py +++ b/csv_functions.py @@ -14,42 +14,39 @@ def __init__(self): self.initialized = True self.statPack = {} - variantFile = __file__.replace('.py', '.json') - if not os.path.exists(variantFile): + self.variantFile = __file__.replace('.py', '.json') + if not os.path.exists(self.variantFile): print('') - print('File %s is missing!' % variantFile) + print('File %s is missing!' % self.variantFile) print('') self.initialized = False return - try: self.variantData = json.load(open(variantFile,'r', encoding='latin-1')) + try: self.variantJson = json.load(open(self.variantFile,'r', encoding='latin-1')) except json.decoder.JSONDecodeError as err: print('') - print('JSON error %s in %s' % (err, variantFile)) + print('JSON error %s in %s' % (err, self.variantFile)) print('') self.initialized = False return - #--turn lists into dictionaries for speed - if 'GARBAGE_VALUES' not in self.variantData: - self.variantData['GARBAGE_VALUES'] = {} - else: - self.variantData['GARBAGE_VALUES'] = dict(zip(self.variantData['GARBAGE_VALUES'], [''] * len(self.variantData['GARBAGE_VALUES']))) - - if 'ORGANIZATION_TOKENS' not in self.variantData: - self.variantData['ORGANIZATION_TOKENS'] = {} - else: - self.variantData['ORGANIZATION_TOKENS'] = dict(zip(self.variantData['ORGANIZATION_TOKENS'], [''] * len(self.variantData['ORGANIZATION_TOKENS']))) - - if 'PERSON_TOKENS' not in self.variantData: - self.variantData['PERSON_TOKENS'] = {} - else: - self.variantData['PERSON_TOKENS'] = dict(zip(self.variantData['PERSON_TOKENS'], [''] * len(self.variantData['PERSON_TOKENS']))) + #--ensure these lists exist + if 'GARBAGE_VALUES' not in self.variantJson: + self.variantJson['GARBAGE_VALUES'] = [] + if 'ORGANIZATION_TOKENS' not in self.variantJson: + self.variantJson['ORGANIZATION_TOKENS'] = [] + if 'PERSON_TOKENS' not in self.variantJson: + self.variantJson['PERSON_TOKENS'] = [] + if 'SENZING_ATTRIBUTES' not in self.variantJson: + self.variantJson['SENZING_ATTRIBUTES'] = [] - if 'SENZING_ATTRIBUTES' not in self.variantData: - self.variantData['SENZING_ATTRIBUTES'] = [] - else: - self.variantData['SENZING_ATTRIBUTES'] = dict(zip(self.variantData['SENZING_ATTRIBUTES'], [''] * len(self.variantData['SENZING_ATTRIBUTES']))) + #--turn lists into dictionaries for speed + self.variantData = {} + for variantList in self.variantJson: + if type(self.variantJson[variantList]) == list: + self.variantData[variantList] = dict(zip([i.upper() for i in self.variantJson[variantList]], [''] * len(self.variantJson[variantList]))) + else: + self.variantData[variantList] = self.variantJson[variantList] #--supported date formats self.dateFormats = [] @@ -102,21 +99,31 @@ def clean_value(self, valueString): return returnValue #----------------------------------- - def is_senzing_attribute(self, attrString): - if attrString in self.variantData['SENZING_ATTRIBUTES']: + def is_senzing_attribute(self, attrName): + attrName = attrName.upper() + if attrName in self.variantData['SENZING_ATTRIBUTES']: return True + elif '_' in attrName: + baseName = attrName[attrName.find('_') + 1:] + if baseName in self.variantData['SENZING_ATTRIBUTES']: + return True + else: + baseName = attrName[0:attrName.rfind('_')] + if baseName in self.variantData['SENZING_ATTRIBUTES']: + return True return False #----------------------------------- - def get_senzing_attribute(self, attrString): - if attrString in self.variantData['SENZING_ATTRIBUTES']: - return self.variantData['SENZING_ATTRIBUTES'][attrString] + def get_senzing_attribute(self, attrName): + attrName = attrName.upper() + if attrName in self.variantData['SENZING_ATTRIBUTES']: + return self.variantData['SENZING_ATTRIBUTES'][attrName] return {} #----------------------------------- def is_organization_name(self, nameString): if nameString: - for token in nameString.lower().replace('.',' ').replace(',',' ').split(): + for token in nameString.replace('.',' ').replace(',',' ').split(): if token.upper() in self.variantData['ORGANIZATION_TOKENS']: return True return False @@ -124,7 +131,7 @@ def is_organization_name(self, nameString): #----------------------------------- def is_person_name(self, nameString): if nameString: - for token in nameString.lower().replace('.',' ').replace(',',' ').split(): + for token in nameString.replace('.',' ').replace(',',' ').split(): if token.upper() in self.variantData['PERSON_TOKENS']: return True return False @@ -133,18 +140,107 @@ def is_person_name(self, nameString): if __name__ == "__main__": appPath = os.path.dirname(os.path.abspath(sys.argv[0])) - global shutDown - shutDown = False - signal.signal(signal.SIGINT, signal_handler) - procStartTime = time.time() - progressInterval = 10000 #--test the instance csvFunctions = csv_functions() - if csvFunctions.initialized: - print('') - print('successfully initialized!') - print('') - - sys.exit() + if not csvFunctions.initialized: + sys.exit(1) + + #--see if they entered arguments + argStr = ' '.join(sys.argv[1:]) + if len(sys.argv) == 1 or 'help' in argStr.lower() or '-h' in argStr.lower(): + print() + print('possible commands ...') + print('\tdisplay lists') + print('\tadd to ') + #print('\tdelete token from list') + print('\tadd file asdf.txt to list') + print() + sys.exit(0) + + if argStr.lower() == 'display lists': + print() + for key in csvFunctions.variantJson.keys(): + print (key) + print() + sys.exit(0) + + if sys.argv[1].lower() == 'add' and len(sys.argv) >= 5: + variantTokens = [] + fileName = '' + targetList = '' + priorToken = '' + for token in sys.argv[2:]: + if priorToken == 'file': + fileName = token + elif priorToken == 'to': + targetList = token + elif token.lower() not in ('file', 'to'): + variantTokens.append(token) + priorToken = token.lower() + + variant = ' '.join(variantTokens).upper() + targetList = targetList.upper() + errorText = '' + + if targetList not in csvFunctions.variantJson: + print() + ok = input('%s is not a current list, create it? (Y/n) ' % targetList) + if ok.upper().startswith('Y'): + csvFunctions.variantJson[targetList] = [] + else: + errorText = 'aborted!' + elif fileName and variant: + #print ('fileName = %s' % fileName) + #print ('variant = %s' % variant) + errorText = 'command not recognized' + elif fileName and not os.path.exists(fileName): + errorText = '%s not found' % fileName + + if errorText: + print() + print(errorText) + print() + sys.exit(1) + else: + print() + addCnt = 0 + skipCnt = 0 + if fileName: + variantList = [line. rstrip('\n') for line in open(fileName)] + else: + variantList = [variant] + for variant in variantList: + variant = variant.upper() + if variant in csvFunctions.variantJson[targetList]: + print('exists: %s' % variant) + skipCnt += 1 + else: + csvFunctions.variantJson[targetList].append(variant) + print('added: %s' % variant) + addCnt += 1 + print() + if addCnt > 0: + print() + ok = input('ok to save? (Y/n) ') + if ok.upper().startswith('Y'): + + #--ensures lists are sorted + for variantList in csvFunctions.variantJson: + if type(csvFunctions.variantJson[variantList]) == list: + csvFunctions.variantJson[variantList] = sorted(csvFunctions.variantJson[variantList]) + #--write to file + with open(csvFunctions.variantFile, 'w') as f: + json.dump(csvFunctions.variantJson, f, indent=4, sort_keys = True) + print() + print('saved!') + print() + + sys.exit(0) + + + print() + print('command not recognized') + print() + sys.exit(1) diff --git a/mappings/test_set1.map b/mappings/test_set1.map index bd887d5..6e44cb6 100644 --- a/mappings/test_set1.map +++ b/mappings/test_set1.map @@ -71,11 +71,11 @@ } }, { - "attribute": "NAME_ORG", + "attribute": "PRIMARY_NAME_ORG", "mapping": "%(name_org)s" }, { - "attribute": "NAME_FULL", + "attribute": "PRIMARY_NAME_FULL", "mapping": "%(name_full)s" }, { @@ -167,7 +167,7 @@ } }, { - "attribute": "ADDR_LINE1", + "attribute": "HOME_ADDR_LINE1", "mapping": "%(addr1)s", "statistics": { "columnName": "addr1", @@ -183,7 +183,7 @@ } }, { - "attribute": "ADDR_CITY", + "attribute": "HOME_ADDR_CITY", "mapping": "%(city)s", "statistics": { "columnName": "city", @@ -195,7 +195,7 @@ } }, { - "attribute": "ADDR_STATE", + "attribute": "HOME_ADDR_STATE", "mapping": "%(state)s", "statistics": { "columnName": "state", @@ -207,7 +207,7 @@ } }, { - "attribute": "ADDR_POSTAL_CODE", + "attribute": "HOME_ADDR_POSTAL_CODE", "mapping": "%(zip)s", "statistics": { "columnName": "zip", diff --git a/output/test_set1.json b/output/test_set1.json index b462414..f7c651f 100644 --- a/output/test_set1.json +++ b/output/test_set1.json @@ -1,6 +1,6 @@ -{"DATA_SOURCE": "test", "ENTITY_TYPE": "ORGANIZATION", "RECORD_ID": "1001", "NAME_ORG": "ABC Company", "RECORD_TYPE": "ORGANIZATION", "PROF_LICENSE": "1001011", "ADDR_LINE1": "111 First", "ADDR_CITY": "Las Vegas", "ADDR_STATE": "NV", "ADDR_POSTAL_CODE": "89111"} -{"DATA_SOURCE": "test", "ENTITY_TYPE": "PERSON", "RECORD_ID": "1002", "NAME_FULL": "Bob Jones", "RECORD_TYPE": "PERSON", "GENDER": "M", "DATE_OF_BIRTH": "2/2/92", "SSN_NUMBER": "2102122", "PROF_LICENSE": "1002022", "ADDR_LINE1": "222 Second", "ADDR_CITY": "Las Vegas", "ADDR_STATE": "NV", "ADDR_POSTAL_CODE": "89112"} -{"DATA_SOURCE": "test", "ENTITY_TYPE": "ORGANIZATION", "RECORD_ID": "1003", "NAME_ORG": "General Hospital", "RECORD_TYPE": "ORGANIZATION", "REF_DOB": "3/3/93", "PROF_LICENSE": "1003033", "ADDR_LINE1": "333 Third", "ADDR_CITY": "Las Vegas", "ADDR_STATE": "NV", "ADDR_POSTAL_CODE": "89113"} -{"DATA_SOURCE": "test", "ENTITY_TYPE": "PERSON", "RECORD_ID": "1004", "NAME_FULL": "Mary Smith", "RECORD_TYPE": "PERSON", "GENDER": "F", "PROF_LICENSE": "1004044", "ADDR_LINE1": "444 Fourth", "ADDR_CITY": "Las Vegas", "ADDR_STATE": "NV", "ADDR_POSTAL_CODE": "89114"} -{"DATA_SOURCE": "test", "ENTITY_TYPE": "PERSON", "RECORD_ID": "1005", "NAME_FULL": "Peter Anderson", "RECORD_TYPE": "PERSON", "PROF_LICENSE": "1005055", "ADDR_LINE1": "555 Fifth", "ADDR_CITY": "Las Vegas", "ADDR_STATE": "NV", "ADDR_POSTAL_CODE": "89115"} -{"DATA_SOURCE": "test", "ENTITY_TYPE": "ORGANIZATION", "RECORD_ID": "1006", "NAME_ORG": "Cleveland Clinic", "RECORD_TYPE": "ORGANIZATION", "REF_SSN": "6060016", "PROF_LICENSE": "1006066", "TAX_ID_NUMBER": "6060016", "ADDR_LINE1": "666 Sixth", "ADDR_CITY": "Las Vegas", "ADDR_STATE": "NV", "ADDR_POSTAL_CODE": "89116"} +{"DATA_SOURCE": "test", "ENTITY_TYPE": "ORGANIZATION", "RECORD_ID": "1001", "PRIMARY_NAME_ORG": "ABC Company", "RECORD_TYPE": "ORGANIZATION", "PROF_LICENSE": "1001011", "HOME_ADDR_LINE1": "111 First", "HOME_ADDR_CITY": "Las Vegas", "HOME_ADDR_STATE": "NV", "HOME_ADDR_POSTAL_CODE": "89111"} +{"DATA_SOURCE": "test", "ENTITY_TYPE": "PERSON", "RECORD_ID": "1002", "PRIMARY_NAME_FULL": "Bob Jones", "RECORD_TYPE": "PERSON", "GENDER": "M", "DATE_OF_BIRTH": "2/2/92", "SSN_NUMBER": "2102122", "PROF_LICENSE": "1002022", "HOME_ADDR_LINE1": "222 Second", "HOME_ADDR_CITY": "Las Vegas", "HOME_ADDR_STATE": "NV", "HOME_ADDR_POSTAL_CODE": "89112"} +{"DATA_SOURCE": "test", "ENTITY_TYPE": "ORGANIZATION", "RECORD_ID": "1003", "PRIMARY_NAME_ORG": "General Hospital", "RECORD_TYPE": "ORGANIZATION", "REF_DOB": "3/3/93", "PROF_LICENSE": "1003033", "HOME_ADDR_LINE1": "333 Third", "HOME_ADDR_CITY": "Las Vegas", "HOME_ADDR_STATE": "NV", "HOME_ADDR_POSTAL_CODE": "89113"} +{"DATA_SOURCE": "test", "ENTITY_TYPE": "PERSON", "RECORD_ID": "1004", "PRIMARY_NAME_FULL": "Mary Smith", "RECORD_TYPE": "PERSON", "GENDER": "F", "PROF_LICENSE": "1004044", "HOME_ADDR_LINE1": "444 Fourth", "HOME_ADDR_CITY": "Las Vegas", "HOME_ADDR_STATE": "NV", "HOME_ADDR_POSTAL_CODE": "89114"} +{"DATA_SOURCE": "test", "ENTITY_TYPE": "PERSON", "RECORD_ID": "1005", "PRIMARY_NAME_FULL": "Peter Anderson", "RECORD_TYPE": "PERSON", "PROF_LICENSE": "1005055", "HOME_ADDR_LINE1": "555 Fifth", "HOME_ADDR_CITY": "Las Vegas", "HOME_ADDR_STATE": "NV", "HOME_ADDR_POSTAL_CODE": "89115"} +{"DATA_SOURCE": "test", "ENTITY_TYPE": "ORGANIZATION", "RECORD_ID": "1006", "PRIMARY_NAME_ORG": "Cleveland Clinic", "RECORD_TYPE": "ORGANIZATION", "REF_SSN": "6060016", "PROF_LICENSE": "1006066", "TAX_ID_NUMBER": "6060016", "HOME_ADDR_LINE1": "666 Sixth", "HOME_ADDR_CITY": "Las Vegas", "HOME_ADDR_STATE": "NV", "HOME_ADDR_POSTAL_CODE": "89116"}