#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 SubAuparavant 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 SubHors ligne


