[GIS] Sorting table on multiple fields using ArcPy

arcpybasic-license-levelsorting

I'm trying to sort a table based on three fields with ArcPy (which should be only one line of code), and I had a "tool is not license" error. I just saw that sorting with multiple fields as parameters is an ArcInfo feature only. I have ArcView (soon ArcEditor).

Any ideas how I could code this to bypass that limitation with ArcPy?

Best Answer

You could create a new empty table and use cursors to sort your data and insert the rows into the new table (this code has not been tested):

import arcpy,os

inTable = r'c:\workspace\path\in_table.dbf'
outPath = r'c:\workspace\path'
sortedTableName = r'sorted_table.dbf'
arcpy.env.workspace = outPath
arcpy.overwriteOutput = True

#--check if output table exists, if not, create it
if not os.exists(os.path.join(outPath,sortedTableName)):
    arcpy.CreateTable_management(outPath,sortedTableName)

    #--make a list of all fields in input table
    flist = arcpy.ListFields(inTable)

    #--add fields to output table
    for f in flist:
        arcpy.AddField_management(sortedTableName,f.name,f.type,f.precision,f.scale,f.length,f.aliasName)

#--if the table does exist, delete all rows so we can start fresh
else:
    try:
        arcpy.DeleteRows_management(os.path.join(outPath,sortedTableName))
    except:
        #--no rows to delete
        pass

#--create an insert cursor that will append data to output table
irows= arcpy.InsertCursor(os.path.join(outPath,sortedTableName))

#--create a search cursor to sort and then read data from input table
rows = arcpy.SearchCursor(inTable,'#','#','#','SORT_FIELD1 A;
                            SORT_FIELD2 D;
                            SORT_FIELD3 A')
for row in rows:
    #--create a new row object in the output table
    newrow = irows.newRow()
    #--populate each field
    for f in flist:
        newrow.setValue(f.name,row.getValue(f.name))
    #--insert new row
    irows.inertRow(newrow)

del irows,rows