Небольшой гайд, в котором я опишу, как написать скрипт для проверки данных на соответствие доменным значениям.
Для тех кто не знает: домены - это правила, описывающие допустимые значения для различных типов полей и обеспечивающие целостность данных. Атрибутивные домены используются для ограничения диапазона значений, допустимых для определенного атрибута таблицы или класса пространственных объектов.
Однако бывают случаи когда недопустимые значения все таки проскальзывают в поля. Именно для того чтобы найти эти несоответствия нужен скрипт описанный ниже.
Скрипт писался на Python 2.7.13 который идет в комплекте к ArcGIS.
Первое что делаем подгружаем модуль arcpy и присваиваем переменным необходимые для работы значения:
import arcpy
fc = 'D:\Arcgis\New Personal Geodatabase.mdb\TEST' #слой/таблица которую буде проверять
domain_2 = arcpy.da.ListDomains("D:\Arcgis\New Personal Geodatabase.mdb") #список доменов которые есть в базе
field_1 = 'ID_COD' #поле из которого будет браться значения для идентификации строки
fields = arcpy.ListFields(fc) #список столбцов которые есть в слое/таблице
a=set() #тут будем хранить доменные значения
Далее с циклом проходим по списку полей (fields) и выясняем у каких столбцов установлены домены и если они есть у столбца то печатаем название столбца так же объявляем переменную cursor с помощью которой будем считывать данные из столбцов:
for field in fields:
cursor = arcpy.SearchCursor(fc,fields)
if field.domain:
print field.name
Далее если если у столбца есть домен то проверяем соответствует ли он домену который есть в базе и если есть то добавляем значения домена во множество:
for domain in domain_2:
if field.domain == domain.name:
for val in domain.codedValues.keys():
a.add(val)
Далее считываем значения из столбцов в которых установлены домены и проверяем есть ли эти значения которые мы ранее добавили во множество. Если они не совпадают то выводится идентификационной номер строки в которой найдено несоответствие:
for row in cursor:
if row.getValue(field.name) not in a:
print (row.getValue(field_1))
По итогу работы получается вот такой список или 'координаты':
название столбца
номер строки
STATUS
1111111
2222222
COMPANY_MANAGER
COMPANY
Далее планирую добавить запись в файл (txt или xls).