Suite

Supprimer les enregistrements dans la classe d'entités qui ont le même ID dans la table CSV à l'aide de curseurs arcpy

Supprimer les enregistrements dans la classe d'entités qui ont le même ID dans la table CSV à l'aide de curseurs arcpy


J'ai donc une table csv avec des enregistrements qui ont un ID. Je souhaite trouver les mêmes identifiants dans une classe d'entités/un fichier de forme et supprimer ces enregistrements dans la classe d'entités/le fichier de forme à l'aide de Python.

J'ai foiré avec add.join et je me rapporte sans un bon résultat, alors j'ai pensé que je passerais aux curseurs. J'ai configuré deux curseurs de recherche pour tester le résultat mais je ne pense pas que la logique soit tout à fait correcte, alors je pose ma question ici.

Voici un extrait de code. Le deuxième curseur finira par se transformer en Update.Cursor en utilisant la ligne de suppression, mais pas avant d'avoir obtenu le résultat correct en premier.

import arcpy tc = "d:	emp	c.shp" changes = "d:	empchanges.csv" avec arcpy.da.SearchCursor(changes,"RECORDNUM_AFTER") comme changecur: pour la ligne dans changecur : changeIDs=row tcur = arcpy.SearchCursor(tc, fields="RECORDNUM") pour la ligne dans tcur : si ligne dans changeIDs : print row.getValue("RECORDNUM")

Stockez tous vos identifiants csv dans une liste python. Ensuite, itérez et supprimez avec un curseur de mise à jour si le numéro de fuite est dans la liste :

import arcpy tc = "d:	emp	c.shp" changes = "d:	empchanges.csv" #List comprehension for IDs ids = set ([i for i, in arcpy.da.SearchCursor (change, "RECORDNUM_AFTER") if i != None]) #mettre à jour le curseur pour supprimer les lignes avec arcpy.da.UpdateCursor (tc, "RECORDNUM") comme curseur : pour recordnum, dans le curseur : si recordnum dans les identifiants : cursor.deleteRow () del curseur

Selon le nombre d'identifiants, une expression SQL peut être plus rapide :

import arcpy tc = "d:	emp	c.shp" changes = "d:	empchanges.csv" #List comprehension for IDs ids = set ([i for i, in arcpy.da.SearchCursor (change, "RECORDNUM_AFTER") if i != None]) #sql expression delFld = arcpy.AddFieldDelimiters (tc, "RECORDNUM") idStr = ", ".join (map (str, ids)) sql = "{0} IN ({1})".format (delFld, idStr) #filtrez et supprimez arcpy.MakeFeatureLayer_management (tc, "lyr", sql) arcpy.DeleteRows_management ("lyr") arcpy.Delete_management ("lyr")

S'il s'agit d'un champ de texte, vous devrez modifier un peu le code :

idStr = "', '".join (map (str, ids)) sql = "{0} IN ('{1}')".format (delFld, idStr)

Cela utilise le module csv pour analyser le fichier CSV et ajouter les valeurs à une liste. Il parcourt ensuite la liste et crée une requête sur leMettre à jour le curseurpour cet identifiant et supprime la ligne si elle existe.

Regardez les commentaires dans le code pour voir quelles parties vous devrez peut-être modifier. Le code ci-dessous suppose queNUMÉRO D'ENREGISTREMENTle type de champ est un entier.

import arcpy import csv fc = "d:	emp	c.shp" csv_data = "d:	empchanges.csv" num_list = [] avec open(csv_data, "r") comme csv_file: reader = csv.reader(csv_file) #saute l'en-tête, supprimez ceci si aucune information d'en-tête n'est présente reader.next() #changez la ligne[0] pour la colonne dont vous avez besoin, la ligne[0] est la première colonne de la ligne dans le lecteur : num_list.append (int(row[0])) num_tuple = str(tuple(num_list)) field = arcpy.AddFieldDelimiters(fc, "RECORDNUM") query = """{0} IN {1}""".format(field, num_tuple) avec arcpy.da.UpdateCursor(fc, ("RECORDNUM"), query) comme curseur : pour la ligne du curseur : cursor.deleteRow()