Переупорядочивать поля (постоянно) в файловой базе геоданных с помощью ArcGIS Desktop?

18

Используя ArcGIS 10.0, возможно ли изменить порядок полей в файловой базе геоданных и сохранить ли порядок в базе данных?

Мы рассмотрели экспорт в XML и написание синтаксического анализатора для изменения порядка полей, а затем воссоздание новой базы данных из XML. Это кажется трудоемким процессом.

Другая идея заключается в том, чтобы импортировать существующие определения полей в Excel, изменить их порядок, экспортировать в CSV, а затем написать скрипт Python для создания этих полей в новой базе геоданных. Существует ли такой сценарий до того, как мы напишем его с нуля?

К сожалению, ArcGIS Diagrammer, похоже, не поддерживает переупорядочение полей.

Есть ли какие-либо скрипты или хаки, которые мы могли бы использовать, чтобы упростить этот процесс?

Стивен Лид
источник
8
Надеюсь, что вы проголосовали на ideas.arcgis.com/ideaView?id=0873000000087wgAAA :-)
PolyGeo
Вы можете изменить порядок полей в ArcGIS Diagrammer, просто перейдите в коллекцию полей, выберите поле и нажмите стрелки вверх / вниз.
blah238
@ blah238, если ты сможешь добавить это как ответ, я приму это. Это работает очень хорошо и частично поддерживается Esri, так как один из их парней написал это
Стивен Лид
1
вот видео демонстрация - maps.esri.com/Diagrammer/reorderfields.htm
Дрор Хар Гил

Ответы:

6

Как уже упоминалось в комментариях, вы можете изменить порядок полей с помощью ArcGIS Diagrammer. В этом ответе я опубликовал более общую пошаговую инструкцию: как обновить свойство длины поля класса пространственных объектов?

blah238
источник
Благодарю. ArcGIS Diagrammer немного нестабилен - он точно не падает, но иногда кажется самодельным. Но для изменения схемы это кажется лучшим вариантом.
Стивен Лид
Может теперь работать после 10.0. Он хорошо для меня установлен на Win7 x64 с ArcGIS 10.1, но при запуске выдает ошибки компиляции Just In Time и завершает работу.
Мэтт Уилки
1
Важно отметить, что ArcGIS Diagrammer больше не работает с ArcGIS 10.3 или выше.
Карта Man
7

В ответ на другой вопрос , я сказал , что можно использовать сводные статистические данные , чтобы сделать эквивалент PULLITEMS (старый Speak для REORDER полей). Этот метод хорошо работает только для таблиц, но теперь есть еще один скрипт, который говорит, что он работает как для классов пространственных объектов, так и для таблиц.

Я хотел бы также рекомендовать ответ на изменение порядка полей постоянно с помощью ArcGIS Сделать таблицу запроса инструмент? который был вдохновлен ответом @klewis на этот.

PolyGeo
источник
6

Бесплатная версия ET Geowizards сделает это. Основные -> Сортировка фигур. Я только что проверил его на файловой базе геоданных v10, и он работает. Это должно создать новый класс объектов, хотя.

pgager
источник
5

Если у вас нет Visio для Diagramer - все остальные ответы здесь нарушают любые объединения. Я нашел, что это работает хорошо в моем случае:

  1. Экспортировать схему для всей базы данных с помощью Arccatalog (Экспорт - XML) - я не экспортировал данные, только схему
  2. Воспользуйтесь онлайн-сервисом Pretty Print для форматирования XML. Откройте XML-файл в текстовом редакторе и измените порядок полей.
  3. Повторно импортируйте схему, чтобы создать новую базу данных.
  4. Перезагрузите данные, используя исходную базу данных в качестве источника
Ozmo
источник
Я отклонил это в первоначальном вопросе как «трудоемкий процесс» - но на самом деле, когда вы так его называете, это звучит не так уж и плохо;)
Стивен Лид
4

Вам нужно запустить MakeTableQuery из набора инструментов Layers и Table Views, чтобы изменить порядок полей. Из документации порядок полей в списке полей указывает порядок отображения полей в выходном слое или табличном представлении. Также, если столбец Shape добавлен в список полей, результатом будет слой; в противном случае это табличное представление. Это доступно с любым уровнем лицензии.

klewis
источник
Просто интересно, протестировали ли вы это, потому что я не вижу способа для инструмента Make Query Table переупорядочить поля - его диалоговое окно инструмента, кажется, просто позволяет вам решить, следует ли включать поля или нет.
PolyGeo
Да, я проверил это из скрипта Python. Похоже, что инструмент предназначен для объединения или объединения нескольких таблиц. Тем не менее, я могу создать новую таблицу или класс пространственных объектов с переупорядоченными полями, введя один класс пространственных объектов.
Klewis
Я, должно быть, что-то упустил, поэтому разместил новый вопрос здесь gis.stackexchange.com/questions/32310/… - не могли бы вы подробно описать шаги для меня, пожалуйста?
PolyGeo
Я только что ответил на новый вопрос, используя не только MakeQueryTable, но также CopyFeatures и небольшое редактирование кода, который я получил, используя Copy As Python Snippet в окне Python.
PolyGeo
4

С помощью Merge Tool вы можете легко изменить порядок полей. Работает с таблицами и классами пространственных объектов. Изменение порядка можно выполнить с помощью скрипта Python и даже с помощью диалогового окна «Инструмент» (удалив поле и повторно добавив его в диалоговое окно). Хотя изменение порядка в диалоге не идеальный подход.

Рекомендуется один раз использовать инструмент «Слияние», затем использовать « Копировать как Python Snippet», затем вручную изменять порядок полей, а затем вставлять код Python в окна Python.

Вот скрипт Python, который использует инструмент Merge для изменения порядка полей (скопировано здесь )

import arcpy

def reorder_fields(table, out_table, field_order, add_missing=True):
    """ 
    Reorders fields in input featureclass/table
    :table:         input table (fc, table, layer, etc)
    :out_table:     output table (fc, table, layer, etc)
    :field_order:   order of fields (objectid, shape not necessary)
    :add_missing:   add missing fields to end if True (leave out if False)
    -> path to output table
    """
    existing_fields = arcpy.ListFields(table)
    existing_field_names = [field.name for field in existing_fields]

    existing_mapping = arcpy.FieldMappings()
    existing_mapping.addTable(table)

    new_mapping = arcpy.FieldMappings()

    def add_mapping(field_name):
        mapping_index = existing_mapping.findFieldMapIndex(field_name)

        # required fields (OBJECTID, etc) will not be in existing mappings
        # they are added automatically
        if mapping_index != -1:
            field_map = existing_mapping.fieldMappings[mapping_index]
            new_mapping.addFieldMap(field_map)

    # add user fields from field_order
    for field_name in field_order:
        if field_name not in existing_field_names:
            raise Exception("Field: {0} not in {1}".format(field_name, table))

        add_mapping(field_name)

    # add missing fields at end
    if add_missing:
        missing_fields = [f for f in existing_field_names if f not in field_order]
        for field_name in missing_fields:
            add_mapping(field_name)

    # use merge with single input just to use new field_mappings
    arcpy.Merge_management(table, out_table, new_mapping)
    return out_table

ИСПОЛЬЗОВАНИЕ:

new_field_order = ["field2", "field3", "field1"]
reorder_fields(in_fc, out_fc, new_field_order)
Фарид Чераги
источник
Кажется, это хорошо работает из диалогового окна инструмента, где я сначала удалил поле, которое я хотел переместить, чтобы быть последним, добавил новое поле, а затем добавил поле ввода. Однако, как вы сказали, использовать его в Python легче, чем через инструмент, когда требуется более сложный переупорядочение.
PolyGeo
3

Существует бесплатное расширение от Esri под названием X-Ray, которое содержит инструмент для изменения порядка полей. Отлично сработал для нас и прост в использовании.

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

отметка
источник
добро пожаловать в GIS Stack Exchange, и спасибо за совет. Я переформатировал ваш ответ, чтобы он больше соответствовал стандартам Stack Exchange - я включил ссылку и цитату о продукте и удалил постороннюю информацию.
Стивен Лид,
2

На сегодняшний день самый эффективный способ переименования полей, изменения их порядка по умолчанию и ряда других вещей заключается в использовании Microsoft Access:

  1. Создать новую персональную базу геоданных
  2. Перетащите класс объектов или таблицу в p-gdb.
  3. Откройте в Access и:
    • Игнорирование начала всех таблиц GDB_, открытие таблиц в режиме конструирования таблиц
    • переименовать, изменить порядок, добавить новый и т. д.
  4. Перетащите обратно в свой реальный рабочий GDB

Примечания:

Всегда иметь резервную копию тока. Вы работаете непосредственно с внутренней структурой GDB, и вы можете легко уничтожить ваши данные, изменив базу данных до такой степени, что ArcGIS больше не знает, как ее читать.

На стороне ArcGIS есть несколько зарезервированных ключевых слов, которые нельзя использовать для имен полей. Access с радостью создаст или переименует поля с этими ключевыми словами, но когда вы вернете их обратно, к ним автоматически будет добавлено подчеркивание. Так Currentстановится Current_. Также обратите внимание на частично перекрывающиеся зарезервированные ключевые слова Access .

Персональная GDB имеет ограничение размера файла 2 ГБ, поэтому общий размер всех таблиц и классов объектов в GDB не может превышать этого.

Может быть соблазнительно всегда использовать личные GDB для небольших проектов (<2 ГБ). Не. Производительность ужасна, и в синтаксисе SQL Access есть небольшие различия, которые делают выражения меток, запросы определений и т. Д. Непереносимыми.

Мэтт Уилки
источник
Конечно, этот метод официально не санкционирован, и если что-то пойдет не так, вы не сможете позвонить в техподдержку;)
Стивен Лид
2

Этот Python Script является своего рода методом «клейкой ленты» для этого. Он ограничен 20 полями, но его можно легко добавить, чтобы он мог работать с любым количеством полей, которые есть у ваших данных.

Скрипт предназначен для запуска в качестве инструмента-скрипта, поэтому вам необходимо настроить параметры в ArcCatalog.

Параметры должны быть следующими:

  • InputFC - класс объектов
  • Расположение выхода - Рабочая область
  • Имя вывода - строка
  • Поле1 - Поле
  • Поле 2 - Поле
  • Вплоть до Field20

Код:

import arcpy, os, sys
from arcpy import env

arcpy.env.overwriteOutput = True

inFC = arcpy.GetParameterAsText(0)
outLoc = arcpy.GetParameterAsText(1)
outName = arcpy.GetParameterAsText(2)
field1 = arcpy.GetParameterAsText(3)
field2 = arcpy.GetParameterAsText(4)
field3 = arcpy.GetParameterAsText(5)
field4 = arcpy.GetParameterAsText(6)
field5 = arcpy.GetParameterAsText(7)
field6 = arcpy.GetParameterAsText(8)
field7 = arcpy.GetParameterAsText(9)
field8 = arcpy.GetParameterAsText(10)
field9 = arcpy.GetParameterAsText(11)
field10 = arcpy.GetParameterAsText(12)
field11 = arcpy.GetParameterAsText(13)
field12 = arcpy.GetParameterAsText(14)
field13 = arcpy.GetParameterAsText(15)
field14 = arcpy.GetParameterAsText(16)
field15 = arcpy.GetParameterAsText(17)
field16 = arcpy.GetParameterAsText(18)
field17 = arcpy.GetParameterAsText(19)
field18 = arcpy.GetParameterAsText(20)
field19 = arcpy.GetParameterAsText(21)
field20 = arcpy.GetParameterAsText(22)

fieldList = ["SHAPE@"]

arcpy.AddMessage(" ")

arcpy.AddMessage("Appending field choices to new List ")

arcpy.AddMessage(" ")

if (field1 != ""):
    fieldList.append(field1)
if (field2 != ""):
    fieldList.append(field2)
if (field3 != ""):
    fieldList.append(field3)
if (field4 != ""):
    fieldList.append(field4)
if (field5 != ""):
    fieldList.append(field5)
if (field6 != ""):
    fieldList.append(field6)
if (field7 != ""):
    fieldList.append(field7)
if (field8 != ""):
    fieldList.append(field8)
if (field9 != ""):
    fieldList.append(field9)
if (field10 != ""):
    fieldList.append(field10)
if (field11 != ""):
    fieldList.append(field1)
if (field12 != ""):
    fieldList.append(field12)
if (field13 != ""):
    fieldList.append(field13)
if (field14 != ""):
    fieldList.append(field14)
if (field15 != ""):
    fieldList.append(field15)
if (field16 != ""):
    fieldList.append(field16)
if (field17 != ""):
    fieldList.append(field17)
if (field18 != ""):
    fieldList.append(field18)
if (field19 != ""):
    fieldList.append(field19)
if (field20 != ""):
    fieldList.append(field20)

arcpy.AddMessage(" ")

#arcpy.AddMessage(fieldList)

oldFieldList = arcpy.ListFields(inFC)

fieldTypes = []

numOfFields = len(fieldList)

fieldIndex = 1

reorderedFields = []

for fld in fieldList:
    for f in oldFieldList:
        if f.name == fld:
            arcpy.AddMessage(f.name)
            reorderedFields.append(f)
            break

arcpy.AddMessage(" ")

arcpy.AddMessage(reorderedFields)

desc = arcpy.Describe(inFC)
geoType = desc.shapeType.upper()
spatRef = arcpy.Describe(inFC).spatialReference

arcpy.CreateFeatureclass_management(outLoc, outName, geoType, "", "", "", spatRef)
newFeat = os.path.join(outLoc, outName)

for flds in reorderedFields:
    if (flds.type == "String"):
        fLength = flds.length
        arcpy.AddField_management(newFeat, flds.name, flds.type, "", "", str(fLength))
    else:
        arcpy.AddField_management(newFeat, flds.name, flds.type)

arcpy.AddMessage(" ")

arcpy.AddMessage(fieldList)

arcpy.AddMessage(" ")

arcpy.AddMessage("Features will be copied with new Schema...")

count = 0

with arcpy.da.SearchCursor(inFC, fieldList) as cursor:
    for row in cursor:
        insertCursor = arcpy.da.InsertCursor(newFeat, (fieldList))
        if (numOfFields == 21):
            insertCursor.insertRow((row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13], row[14], row[15], row[16], row[17], row[18], row[19], row[20]))
            arcpy.AddMessage(" ")
            arcpy.AddMessage("Index: " + str(count) + " -----> " + str(row[1]) + ', ' + str(row[2]) + ', ' + str(row[3]) + ', ' + str(row[4]) + ', ' + str(row[5]) + ', ' + str(row[6]) + ', ' + str(row[7]) + ', ' + str(row[8]) + ', ' + str(row[9]) + ', ' + str(row[10]) + ', ' + str(row[11]) + ', ' + str(row[12]) + ', ' + str(row[13]) + ', ' + str(row[14]) + ', ' + str(row[15]) + ', ' + str(row[16]) + ', ' + str(row[17]) + ', ' + str(row[18]) + ', ' + str(row[19]) + ', ' + str(row[20]))
            count += 1
        elif (numOfFields == 20):
            insertCursor.insertRow((row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13], row[14], row[15], row[16], row[17], row[18], row[19]))
            arcpy.AddMessage(" ")
            arcpy.AddMessage("Index: " + str(count) + " -----> " + str(row[1]) + ', ' + str(row[2]) + ', ' + str(row[3]) + ', ' + str(row[4]) + ', ' + str(row[5]) + ', ' + str(row[6]) + ', ' + str(row[7]) + ', ' + str(row[8]) + ', ' + str(row[9]) + ', ' + str(row[10]) + ', ' + str(row[11]) + ', ' + str(row[12]) + ', ' + str(row[13]) + ', ' + str(row[14]) + ', ' + str(row[15]) + ', ' + str(row[16]) + ', ' + str(row[17]) + ', ' + str(row[18]) + ', ' + str(row[19]))
            count += 1
        elif (numOfFields == 19):
            insertCursor.insertRow((row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13], row[14], row[15], row[16], row[17], row[18]))
            arcpy.AddMessage(" ")
            arcpy.AddMessage("Index: " + str(count) + " -----> " + str(row[1]) + ', ' + str(row[2]) + ', ' + str(row[3]) + ', ' + str(row[4]) + ', ' + str(row[5]) + ', ' + str(row[6]) + ', ' + str(row[7]) + ', ' + str(row[8]) + ', ' + str(row[9]) + ', ' + str(row[10]) + ', ' + str(row[11]) + ', ' + str(row[12]) + ', ' + str(row[13]) + ', ' + str(row[14]) + ', ' + str(row[15]) + ', ' + str(row[16]) + ', ' + str(row[17]) + ', ' + str(row[18]))
            count += 1
        elif (numOfFields == 18):
            insertCursor.insertRow((row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13], row[14], row[15], row[16], row[17]))
            arcpy.AddMessage(" ")
            arcpy.AddMessage("Index: " + str(count) + " -----> " + str(row[1]) + ', ' + str(row[2]) + ', ' + str(row[3]) + ', ' + str(row[4]) + ', ' + str(row[5]) + ', ' + str(row[6]) + ', ' + str(row[7]) + ', ' + str(row[8]) + ', ' + str(row[9]) + ', ' + str(row[10]) + ', ' + str(row[11]) + ', ' + str(row[12]) + ', ' + str(row[13]) + ', ' + str(row[14]) + ', ' + str(row[15]) + ', ' + str(row[16]) + ', ' + str(row[17]))
            count += 1
        elif (numOfFields == 17):
            insertCursor.insertRow((row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13], row[14], row[15], row[16]))
            arcpy.AddMessage(" ")
            arcpy.AddMessage("Index: " + str(count) + " -----> " + str(row[1]) + ', ' + str(row[2]) + ', ' + str(row[3]) + ', ' + str(row[4]) + ', ' + str(row[5]) + ', ' + str(row[6]) + ', ' + str(row[7]) + ', ' + str(row[8]) + ', ' + str(row[9]) + ', ' + str(row[10]) + ', ' + str(row[11]) + ', ' + str(row[12]) + ', ' + str(row[13]) + ', ' + str(row[14]) + ', ' + str(row[15]) + ', ' + str(row[16]))
            count += 1
        elif (numOfFields == 16):
            insertCursor.insertRow((row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13], row[14], row[15]))
            arcpy.AddMessage(" ")
            arcpy.AddMessage("Index: " + str(count) + " -----> " + str(row[1]) + ', ' + str(row[2]) + ', ' + str(row[3]) + ', ' + str(row[4]) + ', ' + str(row[5]) + ', ' + str(row[6]) + ', ' + str(row[7]) + ', ' + str(row[8]) + ', ' + str(row[9]) + ', ' + str(row[10]) + ', ' + str(row[11]) + ', ' + str(row[12]) + ', ' + str(row[13]) + ', ' + str(row[14]) + ', ' + str(row[15]))
            count += 1
        elif (numOfFields == 15):
            insertCursor.insertRow((row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13], row[14]))
            arcpy.AddMessage(" ")
            arcpy.AddMessage("Index: " + str(count) + " -----> " + str(row[1]) + ', ' + str(row[2]) + ', ' + str(row[3]) + ', ' + str(row[4]) + ', ' + str(row[5]) + ', ' + str(row[6]) + ', ' + str(row[7]) + ', ' + str(row[8]) + ', ' + str(row[9]) + ', ' + str(row[10]) + ', ' + str(row[11]) + ', ' + str(row[12]) + ', ' + str(row[13]) + ', ' + str(row[14]))
            count += 1
        elif (numOfFields == 14):
            insertCursor.insertRow((row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13]))
            arcpy.AddMessage(" ")
            arcpy.AddMessage("Index: " + str(count) + " -----> " + str(row[1]) + ', ' + str(row[2]) + ', ' + str(row[3]) + ', ' + str(row[4]) + ', ' + str(row[5]) + ', ' + str(row[6]) + ', ' + str(row[7]) + ', ' + str(row[8]) + ', ' + str(row[9]) + ', ' + str(row[10]) + ', ' + str(row[11]) + ', ' + str(row[12]) + ', ' + str(row[13]))
            count += 1
        elif (numOfFields == 13):
            insertCursor.insertRow((row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12]))
            arcpy.AddMessage(" ")
            arcpy.AddMessage("Index: " + str(count) + " -----> " + str(row[1]) + ', ' + str(row[2]) + ', ' + str(row[3]) + ', ' + str(row[4]) + ', ' + str(row[5]) + ', ' + str(row[6]) + ', ' + str(row[7]) + ', ' + str(row[8]) + ', ' + str(row[9]) + ', ' + str(row[10]) + ', ' + str(row[11]) + ', ' + str(row[12]))
            count += 1
        elif (numOfFields == 12):
            insertCursor.insertRow((row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11]))
            arcpy.AddMessage(" ")
            arcpy.AddMessage("Index: " + str(count) + " -----> " + str(row[1]) + ', ' + str(row[2]) + ', ' + str(row[3]) + ', ' + str(row[4]) + ', ' + str(row[5]) + ', ' + str(row[6]) + ', ' + str(row[7]) + ', ' + str(row[8]) + ', ' + str(row[9]) + ', ' + str(row[10]) + ', ' + str(row[11]))
            count += 1
        elif (numOfFields == 11):
            insertCursor.insertRow((row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10]))
            arcpy.AddMessage(" ")
            arcpy.AddMessage("Index: " + str(count) + " -----> " + str(row[1]) + ', ' + str(row[2]) + ', ' + str(row[3]) + ', ' + str(row[4]) + ', ' + str(row[5]) + ', ' + str(row[6]) + ', ' + str(row[7]) + ', ' + str(row[8]) + ', ' + str(row[9]) + ', ' + str(row[10]))
            count += 1
        elif (numOfFields == 10):
            insertCursor.insertRow((row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9]))
            arcpy.AddMessage(" ")
            arcpy.AddMessage("Index: " + str(count) + " -----> " + str(row[1]) + ', ' + str(row[2]) + ', ' + str(row[3]) + ', ' + str(row[4]) + ', ' + str(row[5]) + ', ' + str(row[6]) + ', ' + str(row[7]) + ', ' + str(row[8]) + ', ' + str(row[9]))
            count += 1
        elif (numOfFields == 9):
            insertCursor.insertRow((row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8]))
            arcpy.AddMessage(" ")
            arcpy.AddMessage("Index: " + str(count) + " -----> " + str(row[1]) + ', ' + str(row[2]) + ', ' + str(row[3]) + ', ' + str(row[4]) + ', ' + str(row[5]) + ', ' + str(row[6]) + ', ' + str(row[7]) + ', ' + str(row[8]))
            count += 1
        elif (numOfFields == 8):
            insertCursor.insertRow((row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7]))
            arcpy.AddMessage(" ")
            arcpy.AddMessage("Index: " + str(count) + " -----> " + str(row[1]) + ', ' + str(row[2]) + ', ' + str(row[3]) + ', ' + str(row[4]) + ', ' + str(row[5]) + ', ' + str(row[6]) + ', ' + str(row[7]))
            count += 1
        elif (numOfFields == 7):
            insertCursor.insertRow((row[0], row[1], row[2], row[3], row[4], row[5], row[6]))
            arcpy.AddMessage(" ")
            arcpy.AddMessage("Index: " + str(count) + " -----> " + str(row[1]) + ', ' + str(row[2]) + ', ' + str(row[3]) + ', ' + str(row[4]) + ', ' + str(row[5]) + ', ' + str(row[6]))
            count += 1
        elif (numOfFields == 6):
            insertCursor.insertRow((row[0], row[1], row[2], row[3], row[4], row[5]))
            arcpy.AddMessage(" ")
            arcpy.AddMessage("Index: " + str(count) + " -----> " + str(row[1]) + ', ' + str(row[2]) + ', ' + str(row[3]) + ', ' + str(row[4]) + ', ' + str(row[5]))
            count += 1
        elif (numOfFields == 5):
            insertCursor.insertRow((row[0], row[1], row[2], row[3], row[4]))
            arcpy.AddMessage(" ")
            arcpy.AddMessage("Index: " + str(count) + " -----> " + str(row[1]) + ', ' + str(row[2]) + ', ' + str(row[3]) + ', ' + str(row[4]))
            count += 1
        elif (numOfFields == 4):
            insertCursor.insertRow((row[0], row[1], row[2], row[3]))
            arcpy.AddMessage(" ")
            arcpy.AddMessage("Index: " + str(count) + " -----> " + str(row[1]) + ', ' + str(row[2]) + ', ' + str(row[3]))
            count += 1
        elif (numOfFields == 3):
            insertCursor.insertRow((row[0], row[1], row[2]))
            arcpy.AddMessage(" ")
            arcpy.AddMessage("Index: " + str(count) + " -----> " + str(row[1]) + ', ' + str(row[2]))
            count += 1
        elif (numOfFields == 2):
            insertCursor.insertRow((row[0], row[1]))
            arcpy.AddMessage(" ")
            arcpy.AddMessage("Index: " + str(count) + " -----> " + str(row[1]))
            count += 1

Я понимаю, что это не самый красивый и эффективный способ сделать это, но на самом деле он работает довольно хорошо, и на его написание ушло всего около получаса. Я использую это все время, когда мне нужно изменить порядок полей, и это не требует Diagrammer или Microsoft Access. Конечно, максимальное количество полей может быть проблемой, но опять же, это может быть настроено в скрипте.

GeoJohn
источник