Skip to main content

Originally, posted this question last year, but for to post an update and the community bot deleted it due to inactivity.

Update: Found a Python 2 script on the Stack Exchange, and converted it into a python 3 script. Brought in the parent and child versions into a project as separate database connections, so I could have two different paths for the parent and child version.

Originally, posted this question last year, but for to post an update and the community bot deleted it due to inactivity.

Update: Found a Python 2 script on the Stack Exchange, and converted it into a python 3 script. Brought in the parent and child versions into a project as separate database connections, so I could have two different paths for the parent and child version.

Found a Python 2 script on the Stack Exchange, and converted it into a python 3 script. Brought in the parent and child versions into a project as separate database connections, so I could have two different paths for the parent and child version.

Source Link

Originally, posted this question last year, but for to post an update and the community bot deleted it due to inactivity.

Update: Found a Python 2 script on the Stack Exchange, and converted it into a python 3 script. Brought in the parent and child versions into a project as separate database connections, so I could have two different paths for the parent and child version.

    import arcpy
    import os

inputDataset = r"C:\Users\vazquel\OneDrive\Documents\LocalWorkspace\Parent.gdb\ParentVersion"
targetDataset = r"C:\Users\vazquel\OneDrive\Documents\LocalWorkspace\Child.gdb\ChildVersion"

outputFolder = r"C:\Users\vazquel\Desktop\LocalWorkspace\ComparisonReports"
outputName = "Comparison_Report_1"

inputDict = {}
changes = []

#GET FIELDS


arcpy.AddMessage("Getting Fields\n")
fields = ["OID@", "Shape@JSON"]
fieldList = arcpy.ListFields(targetDataset)
for field in fieldList:
    if field.name not in ("OBJECTID", "SHAPE", "Shape_Length", "Shape_Area", "RuleID", "Override"):
        fields.append(field.name)

#SEARCH INPUT DATASET, ADD DATA TO DICTIONARY


arcpy.AddMessage("Searching Input Dataset\n")
with arcpy.da.SearchCursor(inputDataset, fields) as inputRows:
    for inputRow in inputRows:
        oid = inputRow[0]
        geom = inputRow[1]
        attrs = {"Geometry":geom}
        for i in range(len(fields)):
            if i > 1:
                field = str(fields[i])
                attrs[field] = inputRow[i]
        inputDict[oid] = attrs

#SEARCH TARGET DATASET AND COMPARE TO DICTIONARY DATA


arcpy.AddMessage("Searching Target Dataset\n")
with arcpy.da.SearchCursor(targetDataset, fields) as targetRows:
    for targetRow in targetRows:
        # If no match in dictionary, it's a delete
        oid = targetRow[0]
        if oid not in inputDict.keys():
            changes.append([oid, "Delete", "N/A", "N/A", "N/A"])
        else:

            # If geometries don't match, it's a geometry update
            geom = targetRow[1]
            if geom != inputDict[oid]["Geometry"]:
                changes.append([oid, "Geometry Update", "N/A", "N/A", "N/A"])

            # If attribute values don't match, it's an attribute update
            for j in range(len(fields)):
                if j > 1:
                    field = str(fields[j])
                    value = targetRow[j]
                    if value != inputDict[oid][field]:
                        changes.append([oid, "Attribute Update", field, value, inputDict[oid][field]])

            # If there was a match, remove item from dictionary
            del inputDict[oid]

#Anything left in the dictionary is an added feature


for oid in inputDict.keys():
    changes.append([oid, "Add", "N/A", "N/A", "N/A"])
#Write Output Change File


arcpy.AddMessage("Writing Output File\n")
outputFile = open(outputFolder + os.sep + outputName + ".csv", "w")
outputFile.write("OID,CHANGETYPE,FIELD,INPUTVALUE,TARGETVALUE\n")
for change in changes:
    line = ""
    for item in change:
        line += str(item)
        line += ","
    line = line[:-1]
    line += "\n"
    outputFile.write(line)
    
arcpy.AddMessage("\n\nAll Done!\n\n")

outputFile.close()