IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Cobol Discussion :

Mouvementer des caractères alphanumériques 1 par 1 depuis une table vers une zone élémentaire


Sujet :

Cobol

  1. #1
    Membre averti
    Inscrit en
    Octobre 2011
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 49
    Par défaut Mouvementer des caractères alphanumériques 1 par 1 depuis une table vers une zone élémentaire
    Bonjour,

    je voudrais déplacer dans une zone unique provenant des éléments d'une table définie en data division par occurs. Ce faire sans écraser les données déplacées dans cette zone précédemment.

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    data division.
    01 samuuser-out.
               03 nomsamu pic x(27).
               03 nom-samu redefines nomsamu.
                  05 stab occurs 27 times pic x.
               03 filler pic x value ",".
               03 prenomsamu pic x(24).
    
    01 gmailuser-out.
               03 prenomgmail pic x(24).
               03 filler pic x value ",".
               03 nomgmail pic x(27).
               03 nom-gmail redefines nomgmail.
                  05 gtab occurs 27 times pic x.
               03 filler pic x value ",".
               03 emailgmail pic x(38).
    
    
    01 scanzone.
            03 teststab pic x(27).
            03 testgtab pic x(27).
    
    
    procedure division.
    
    move 1 to I
    perform scanchar varying I from 1 by 1
                                     until gtab (I) not= stab (I) or I=27
    
    ..........
    ..........
    ...........
    
    
    scanchar.
    move gtab (I) to testgtab.
    move stab (I) to teststab. 
    Add 1 to I.
    est-ce que je ne vais pas chaque fois écraser la donnée du "move" précédent?

    peux t-on faire un unstring gtab (I) et stab (I) into une autre zone élément par élément? ou dois je utiliser des tables supplémentaires?
    s étrJe dois tester une égalité entre deux variables contenant des noms venant de 2 fichiers différents.
    Le nom dans un fichier est raccourci par rapport au nom venant de l'autre fichier et dans ce fichier il y a beaucoup de noms composés de différentes origines.

    par exemple 1er fichier : DA CUNHA
    RAMIREZ
    TAWIL ABRAOUI
    Di ROBERTO
    2eme fichier : DA CUNHA GONCALVES GONZALES
    RAMIREZ NARWAEZ RODRIGEZ
    TALWIL ABRAOUI EL DRAOUI
    DI ROBERTO DI MARIA

    Merci pour vos idées


    Negob

  2. #2
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Par défaut
    Citation Envoyé par negob Voir le message
    ...
    est-ce que je ne vais pas chaque fois écraser la donnée du "move" précédent?
    Oui, à mon avis, tu devrais écraser ta donnée à chaque itération ...

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 593
    Billets dans le blog
    10
    Par défaut
    Bonsoir,

    J'ai du mal à comprendre le résultat attendu.
    En tout cas l'instruction MOVE en COBOL sur une cible de type alphanumérique - PICTURE X(n) - ou alphabétique - PICTURE A(n) - complète à blanc la variable cible.

  4. #4
    Membre averti
    Inscrit en
    Octobre 2011
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 49
    Par défaut
    Bonjour,

    J'ai besoin de comparer des enregistrements venant de deux fichiers différents se rapportant à une même personne. Les deux fichiers en entrée sont trier alphabétiquement sur la valeur du nom

    Le problème est que certaines personnes ont leur nom simplifié dans un fichier et leur nom complet dans l'autre fichier. Donc si je recherche une égalité sur le nom entre les deux enregistrements de ces personnes, je ne la trouve jamais.

    C'est pour ça que j'imagine avant de tester l'égalité, extraire la partie du nom le plus long dans un fichier qui est égale au même nom simplifié dans l'autre fichier. Ensuite quand j'ai cette égalité je peu faire le traitement qui est prévu

    Pour a j'imagine faire un test d'égalité caractère par caractère entre deux tables en faisant incrémentant le même indice de 1 à chaque passage dans les tables jusqu'à ce que les deux caractères des deux tables ne sont plus égaux

    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    DA CUNHA                                                        
    01 nomzone1                                                    
    01 nomzon1 redefines nomzone1 pic x(n).                                                                         
         03 gtab occurs n  pic x.                                             
     
    
    DA CUNHA GONCALVES GONZALES
    01 nomzone2.
    01 nomzon2 redefines nomzone2 pic x(n).
         03 stab occurs n pic x.
    
    
    01 zone
    01 zon1 refedines zone pic x(n).
         03 nomzon occurs n pic x.
    
    
    move 1 to i.
    perform scanchar i  varying 1 by 1 until gtab (i)  not= stab (i) or i > n.
    move i to j.
    move 1 to i.
    perform transfert until i=j.
    
    scanchar.
    
       display " gtab (i) =   "  gtab (i).
       display " stab (i) =    "  stab (i).
       display " nomzon1   =   "   nomzon1.
       display " nomzon1   =   "   nomzon1.
    
    
    transfert.
       move stab (i) to nomzon (i).
       display "nomzon (i)   =  "  nomzon (i).
       display " zon1  =  "  zon1. 
       add 1 to i.

    Si je fais ça je dois arriver à isoler la partie du nom du fichier identique au nom de l'autre fichier et tester une égalité entre les deux enregistrements d'une même personne.

    Si égalité je dis que la personne est sous contrat dans l'institution et doit avoir son compte gmail actif dans le fichier des utilisateurs gmail.


    L'autre cas est si la personne du fichier gmail n'existe pas dans le fichier des personnes sous contrat. Alors je dois suspendre son compte gmail dans le fichier gmail

    Comment faire pour distinguer les inégalités entre les zones noms à cause de longueurs de nom différentes mais appartenant à la même personne des zones noms différents car elles se rapportent à des personnes différentes?

    J'espère avoir été plus clair avec mon exemple.

    Merci d'avance,

    Negob

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 593
    Billets dans le blog
    10
    Par défaut
    bonjour,

    il s'agit donc de comparer deux chaines de caractères issues de deux sources différentes et de déterminer s'il y a correspondance ou non entre ces deux sources.
    il faudrait en dire un peu plus sur le contexte et sur le nombre de personnes potentielles dans chaque source.

    En effet, pour avoir travaillé sur de nombreux chantiers de convergence de S.I., je connais bien cette problématique de rapprochement des individus.
    Plus la population est nombreuse, plus le risque de rencontrer de faux synonymes est important.
    Par exemple deux personnes s'appelant "jacques martin" ne sont pas forcément les mêmes.
    Aucune méthode de rapprochement n'est fiable à 100%, mais, parmi les plus fiables, on trouve celles qui utilisent le NIR (anciennement NNI) en combinaison avec d'autres critères. L'utilisation de la seule combinaison nom+prénom est extrêmement risquée.

    Il faudrait donc enrichir vos fichiers en entrée à minima du NIR si possible, à défaut d'un matricule employé ou autre identifiant distinctif.

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    Par défaut
    Je plussoie Escartefigue.

    J'ai vu des rapprochements avec nom/prénom/date de naissance/lieu de naissance/sexe, et c'était déjà pas parfait (surtout que pour les gens nés à l'étranger, le lieu, c'était le pays, pas la ville). D'ailleurs, le plus buggué, c'était le sexe, limite on aurait mieux fait de ne même pas essayer de le différencier (on avait 10% d'erreurs en base sur MR/MME - oui, 10% - et va savoir si Claude Marie Pierre est un homme ou une femme). La seule méthode à peu près fiable, c'est bien l'identifiant unique.

    Si vraiment on a que les noms, ben, il faut déjà se résoudre à l'idée qu'il y aura un paquet de doutes à régler à la main. Un algo ne pourra que dégrossir. Et pour faire ça, je ne vois qu'une comparaison caractère par caractère, avec des règles qu'on ajuste en fonction de ce qu'on trouve. C'est un travail de fourmi ingrat et pas très productif, quelle que soit la méthode choisie.

  7. #7
    Membre averti
    Inscrit en
    Octobre 2011
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 49
    Par défaut
    Bonjour,

    Vous avez très bien résumé le problème.

    J'ai pensé utilisé le champs unique numéro de matricule qui est présent dans le fichier source des travailleurs sous contrat, mais ce champs n'existe pas dans l'autre fichier source des travailleurs ayant un compte Gmail actif dans l'entreprise.
    Donc si je veux enrichir ce fichier avec le numéro de matricule, je serai confronté à la même problématique de correspondance des noms.
    Dans le fichier des travailleurs sous contrat, les noms sont complets car ils sont transposés des cartes d'identité. dans le fichier des comptes Gmail les noms sont simplifiés et raccourcis.

    Le fichier des travailleurs sous contrat comporte environ 500 enregistrements, celui des comptes Gmail en comporte environ 700.

    La plupart des noms sont à consonnance étrangère comme par exemple :

    DA CUNHA FERREIRA GONCALVES
    GONZALEZ EZTALA
    KANAMUGIRE ABDOUL
    NARVAEZ GONZALEZ
    CHAMAGO DJIADEU PERRIN
    KUVEDU-LIBLA AKOUWA
    J'ai aussi des noms à consonnance plus occidentales dont certains aussi avec des particules.
    Je n'ai pas heureusement trop de doublons. Un seul "Dupont" et un seul "Mercier"
    J'ai bien des noms identiques appartenant à des soeurs sous contrat mais comme les fichiers sources sont triés alphabétiquement sur le nom, ça ne devrait pas poser trop de problème.

    Pour distinguer les inégalités liées à la longueur des noms pour la même personne de celles des noms différent entre deux enregistrement mon idée serait de partir du nom dont le nombre de caractère est le plus petit et de partir avec un indice comprenant le nombre de caractères de ce plus petit nom.

    Exemple : KOC i=3

    Ça donne ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    perform test-egal-3 i varying 1 by 1 until gtab (i) = stab (i) and i > 3.
    display "nomzon1  =     " nomzon1.
    display" nomzon2   =    " nomzon2. 
    if nomzon1 not= nomzon2 and i> 3
           perform scanchar i varying 1 by 1 until gtab (i) not= stab (i) or i > n
           move i to j
           move 1 to i
           perform transfert until i=j
           perform egal
                 else perform not egal
    
    
    
    test-egal-3.
            (ne rien faire)
    
    scanchar.
    display " gtab (i) = " gtab (i).
    display " stab (i) = " stab (i).
    display " nomzon1 = " nomzon1.
    
    
    transfert.
    move stab (i) to nomzon (i).
    display "nomzon (i) = " nomzon (i).
    display " zon1 = " zon1.
    display "nomzon1   =   " nomzon1.
    add 1 to i.
    
    
    egal.
    ....
    ....
    ....
    ....
    
    not egal.
    
    ....
    ....
    ....
    Je devrais faire un algorithme de ce genre pour filtrer un maximum de cas et dégrossir le fichier de tous les cas d'égalité sur le nom pour les mêmes personnes dans les deux fichiers sources.

    Bien à vous,

    Negob.

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 593
    Billets dans le blog
    10
    Par défaut
    Vu le nombre très faible de cas, en l'absence d'identifiant fiable, une solution simple est de charger les deux listes triées dans excel et de valider manuellement la correspondance dans une colonne consacrée.
    Ce sera plus fiable et pour un coût de développement quasi nul

    Question subsidiaire : vu la piètre qualité des données fournies, êtes vous certain que la liste est toujours nom puis prénom ou l'inverse et qu'il n'y a pas un mélange des deux... Je ne serais pas surpris du contraire
    D'une façon générale, rapprocher des ensembles sur des valeurs de type chaîne de caractères est hasardeux.

    Cerise sur le gâteau, il n'est pas exclu que les jeux de caractères de l'une et l'autre source soient différents, ce qui pourrait en plus induire de faux écarts !

    EDIT : piège classique, dans un cas on a le nom de naissance de la personne, dans l'autre, le nom marital (nom d'époux) ou nom d'usage...

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/02/2019, 13h09
  2. [DW 8 & antérieurs] Encodage des caractères en utf8 par défaut (sans utf8_encode)
    Par haltabush dans le forum Dreamweaver
    Réponses: 7
    Dernier message: 11/02/2009, 10h56
  3. [RegEx] Expression régulière sur des caractères alphanumériques
    Par hash95 dans le forum Langage
    Réponses: 3
    Dernier message: 16/01/2008, 17h26
  4. RegExp des caractères alphanumériques limités
    Par witch dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 27/12/2007, 00h09
  5. Réponses: 1
    Dernier message: 07/06/2006, 18h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo