7

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?

6

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
  • Didn't thought of that one! Thanks! – fgcartographix Apr 3 '12 at 16:51
  • @fgcartographix, let me know if this works, if it does I'd appreciate it if you'd click on "accept answer"! :O) – Jason Apr 3 '12 at 17:22
  • Thats a very clever workaround. Great idea. – RyanDalton Apr 3 '12 at 17:30
  • Of course... already clicked. In theory, it should work well... – fgcartographix Apr 3 '12 at 17:44
  • 1
    @fgcartographix, I updated the code to handle the case where the table already exists and has rows in it (e.g. the script ran, and inserted some rows, but then bombed). – Jason Apr 3 '12 at 17:51

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.