#1 Tue 17 January 2012 15:23
- philomelos40
- Participant occasionnel
- Date d'inscription: 15 Apr 2006
- Messages: 16
[Arcgis 9.3] - Recherche doublons dans un champs
Bonjour à tous,
Existe-t-il un moyen de rechercher des doublons à l'intérieur d'un même champs (shape ou gdb)?
Dans mon cas, je possède des chaînes de caractères qui se répètent et je souhaiterai pouvoir les individualiser pour ensuite les supprimer.
Merci pour vos réponses.
Hors ligne
#2 Tue 17 January 2012 15:44
- dominique.lys
- Participant assidu
- Date d'inscription: 5 Oct 2006
- Messages: 473
- Site web
Re: [Arcgis 9.3] - Recherche doublons dans un champs
Salut,
Avec Easy Calculate un ensemble de formule pour le calcul de champs, voir les deux formules suivantes :
- field_Mark_Duplicates.cal : All records with values in the specified field that duplicate an already existing value will be marked with 1. The first instance of each duplicated record, and any records with no duplicates will get a value of 0.
- field_Mark_Duplicates.cal1 : All records with values in the specified field, that duplicates an already existing value will be marked with the ID of the record they duplicate. The records with no duplicates will get a value of -1
Hors ligne
#3 Tue 17 January 2012 16:27
- philomelos40
- Participant occasionnel
- Date d'inscription: 15 Apr 2006
- Messages: 16
Re: [Arcgis 9.3] - Recherche doublons dans un champs
Merci pour votre réponse.
J'avais déjà essayé ces codes mais sans succès; le problème vient peut-être du format de mon champs (chaine)?
Si quelqu'un à une autre solution!
Hors ligne
#4 Wed 18 January 2012 12:13
- dominique.lys
- Participant assidu
- Date d'inscription: 5 Oct 2006
- Messages: 473
- Site web
Re: [Arcgis 9.3] - Recherche doublons dans un champs
Quelle est le problème, es-tu certain d'avoir correctement configuré les formules?
Par exemple si tu as une table avec un champs "nom" de type chaine qui contient des doublons que tu souhaites identifier. Il faut :
- créer un nouveau champs de type integer
- lancer le field calculator sur ce champs et charger une des deux formules
- Avant d’exécuter le code il faut dans la section "Pre-logic VBA code" modifier la variable sField par le nom du champs qui contient les doublons
Dernière modification par dominique.lys (Thu 19 January 2012 10:28)
Hors ligne
#5 Wed 18 January 2012 16:35
- Benjamin BRETON
- Participant occasionnel
- Date d'inscription: 1 Jun 2006
- Messages: 15
Re: [Arcgis 9.3] - Recherche doublons dans un champs
la fonction recapituler te donner cette information aussi
Hors ligne
#6 Wed 18 January 2012 16:38
- philomelos40
- Participant occasionnel
- Date d'inscription: 15 Apr 2006
- Messages: 16
Re: [Arcgis 9.3] - Recherche doublons dans un champs
C'est la méthode que j'ai employé.
J'ai essayé sur un dbf et sur une entité (shape et géodatabase), dans les 2 cas des doublons sont signalés alors qu'il n'y en a pas ,et vice versa.
Le champ a traité contient des chaînes de caractères séparées par une virgule (ex : chaîne,chaîne...).
Hors ligne
#7 Wed 18 January 2012 16:42
- philomelos40
- Participant occasionnel
- Date d'inscription: 15 Apr 2006
- Messages: 16
Re: [Arcgis 9.3] - Recherche doublons dans un champs
Il me semble que la fonction récapituler permet de calculer le nombre de chaîne de caractères mais il ne dissocie pas les valeurs qui se répètent à l'intérieur d'une même cellule.
Hors ligne
#8 Thu 19 January 2012 10:32
- dominique.lys
- Participant assidu
- Date d'inscription: 5 Oct 2006
- Messages: 473
- Site web
Re: [Arcgis 9.3] - Recherche doublons dans un champs
Peut être peux-tu nous joindre un extrait de ta base de donnée avec quelques enregistrements qui posent problème. Chez moi la formule fonctionne correctement même avec des chaines contenant des virgules ou des caractères accentués. Comme ça je ne vois quel est le problème.
Sinon tu peux toujours envisager de faire ce traitement dans un tableur.
Hors ligne
#9 Thu 19 January 2012 11:21
- Josendros
- Participant occasionnel
- Date d'inscription: 19 Jan 2012
- Messages: 22
Re: [Arcgis 9.3] - Recherche doublons dans un champs
Bonjour,
Voici un script en vb qui fonctionne aussi en version 10 qui s'appuie sur le shape :
il suffit de créer un bouton dans une barre d'outil,
celui-ci ouvre une userform avec une liste déroulante contenant l'ensemble des couches du bloc activé.
Code:
Private Sub cmd_valid_Click() Dim nom_couche As String nom_couche = L_couches.Value recherchedoublons nom_couche End Sub Private Sub UserForm_Activate() 'remplissage de la liste déroulante Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument Dim pMap As IMap Set pMap = pMxDoc.FocusMap Dim pLayers As IEnumLayer Set pLayers = pMap.Layers Dim pLayer As ILayer Set pLayer = pLayers.Next Do Until pLayer Is Nothing If TypeOf pLayer Is IFeatureLayer Then Dim pFLayer As IFeatureLayer Set pFLayer = pLayer L_couches.AddItem pLayer.Name End If Set pLayer = pLayers.Next Loop End Sub
Auparavant il faut créer un userform (.frm) dans l'éditeur vb (alt+F11) contenant ce code,
on peut ainsi l'importer dans n'importe doc mxd.
a+
Hors ligne
#10 Thu 19 January 2012 11:25
- Josendros
- Participant occasionnel
- Date d'inscription: 19 Jan 2012
- Messages: 22
Re: [Arcgis 9.3] - Recherche doublons dans un champs
Forcément j'oublie la macro principale! (à mettre dans un module.bat=>
Code:
Sub recherchedoublons(LayerName As String) '***Description : Permet de définir les doublons existants et de les sélectionner BasculerEnModeDonnées ActiverBlocDonnées "CARTE00" Dim msg As String msg = "Liste des OID" & vbNewLine Dim nb As Long nb = 0 Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument Dim pFLayer As IFeatureLayer Dim pMap As IMap Set pMap = pMxDoc.FocusMap Dim pLayers As IEnumLayer Set pLayers = pMap.Layers Dim pLayer As ILayer Set pLayer = pLayers.Next Dim Trouvé As Boolean Trouvé = False Do Until pLayer Is Nothing If TypeOf pLayer Is IFeatureLayer Then Set pFLayer = pLayer If pLayer.Name = LayerName Then Trouvé = True Exit Do End If End If Set pLayer = pLayers.Next Loop If Not Trouvé Then MsgBox "Couche non trouvé dans le document!", vbInformation Exit Sub End If 'calcul du nombre d'entités dans la table sélectionnée Dim pFC1 As IFeatureClass Set pFC1 = pFLayer.FeatureClass Dim nbEntite As Integer nbEntite = pFC1.FeatureCount(Nothing) 'Crée un espace de travail temporaire nécessaire à la sélection Dim pScratchWorkspace As IWorkspace Dim pScratchWorkspaceFactory As IScratchWorkspaceFactory Set pScratchWorkspaceFactory = New ScratchWorkspaceFactory Set pScratchWorkspace = pScratchWorkspaceFactory.DefaultScratchWorkspace 'On sélectionne toutes les entités. Dim pSelSet As ISelectionSet Set pSelSet = pFLayer.FeatureClass.Select(Nothing, esriSelectionTypeIDSet, _ esriSelectionOptionNormal, pScratchWorkspace) Dim pFCurs1 As IFeatureCursor Dim pFCurs2 As IFeatureCursor pSelSet.Search Nothing, False, pFCurs1 Dim pF1 As IFeature Dim pF2 As IFeature Set pF1 = pFCurs1.NextFeature Dim pSFilter As ISpatialFilter 'Cette ligne et les 2 suivantes sont à écrire avant Do Until pF is Nothing Set pSFilter = New SpatialFilter pSFilter.SpatialRel = esriSpatialRelIntersects Dim pRelOp As IRelationalOperator 'Avant Do Until pF is Nothing frmDoublons.Hide BPinit nbEntite PROGRESSION.Caption = "Analyse de la table" Dim I As Integer Do Until pF1 Is Nothing I = I + 1 If I Mod 50 = 0 Then BPshow 50 End If pSelSet.RemoveList 1, pF1.OID 'Pour ne plus tester l'entité pF, on la retire depSelSet Set pSFilter.Geometry = pF1.Shape pSelSet.Search pSFilter, False, pFCurs2 Set pF2 = pFCurs2.NextFeature Set pRelOp = pF1.Shape Do Until pF2 Is Nothing If pRelOp.Equals(pF2.Shape) Then pSelSet.RemoveList 1, pF2.OID 'Pour ne plus tester l'entité pF2, on la retire de pSelSet 'Sélection de pF2, ajout de pF2 à la liste des doublons et incrémentation du compteur des doublons. 'traitement nb = nb + 1 pMap.SelectFeature pFLayer, pF2 msg = msg & pF2.Value(pF1.Fields.FindField("OBJECTID")) & vbNewLine '-------------' End If Set pF2 = pFCurs2.NextFeature Loop Set pF1 = pFCurs1.NextFeature Loop PROGRESSION.Hide pMxDoc.ActiveView.Refresh 'pas de doublons If nb = 0 Then MsgBox "La table ne contient pas de doublons.", , "Résultats : " Else MsgBox msg, , "Résultats : " & nb & " doublons" End If End Sub
Hors ligne