Take the 2-minute tour ×
Geographic Information Systems Stack Exchange is a question and answer site for cartographers, geographers and GIS professionals. It's 100% free, no registration required.

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?

Thanks!

share|improve this question

1 Answer 1

up vote 3 down vote accepted

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 acrpy,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
share|improve this answer
    
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

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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