banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

GEODATA DAYS 2024

#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

 

Pied de page des forums

Powered by FluxBB