Pull to refresh

Небольшой скрипт на python для поиска ошибок

Небольшой гайд, в котором я опишу, как написать скрипт для проверки данных на соответствие доменным значениям.

Для тех кто не знает: домены - это правила, описывающие допустимые значения для различных типов полей и обеспечивающие целостность данных. Атрибутивные домены используются для ограничения диапазона значений, допустимых для определенного атрибута таблицы или класса пространственных объектов.

Однако бывают случаи когда недопустимые значения все таки проскальзывают в поля. Именно для того чтобы найти эти несоответствия нужен скрипт описанный ниже.

Скрипт писался на 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).

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.