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 :

Cobol Regex (REGular EXpression)


Sujet :

Cobol

  1. #1
    Membre averti Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Points : 346
    Points
    346
    Par défaut Cobol Regex (REGular EXpression)
    Bonjour,

    Je dois faire un travail un peu spécifique en cobol et je ne sais pas trop comment le faire de manière propre.
    Google m'envoie Chxxx quand je tape 'COBOL Regex'

    En gros j'ai une table DB2 qui va contenir des lignes avec une valeur et un format.
    Dans mon programme je vais lire la table, récupérer le format et vérifier que ma variable est au format récupéré.

    Comment je pourrais représenter le format de manière pertinente ?

    Par exemple pour un format PIC X(6) contenant 4 numérique, un espace puis une lettre, j'ai pensé a stocker une ligne 'NNNN A' (N=numérique, ' '=espace et 'A'=Alpha).
    Mais je trouve ma solution un peu casse gueule. Ne serait-ce que pour le fait d'être obligé de bosser qu'avec des SUBSTRING.

    Avez-vous des solutions plus propre à me proposer ?
    Merci d'avance pour votre aide.


    PS :
    Si ça ne tenait qu'à moi j'aurai fait la structure suivante :
    01 Structure.
    05 1-ERE-LETTRE PIC X(1).
    88 Value-Correct Value '0' THRU '9'
    05 2-EME-LETTRE PIC X(1).
    88 Value-Correct Value '0' THRU '9'
    05 3-EME-LETTRE PIC X(1).
    88 Value-Correct Value '0' THRU '9'
    05 4-EME-LETTRE PIC X(1).
    88 Value-Correct Value '0' THRU '9'
    05 5-EME-LETTRE PIC X(1).
    88 Value-Correct Value ' '
    05 6-EME-LETTRE PIC X(1).
    88 Value-Correct Value ' ', 'A' THRU 'Z', 'a' THRU 'z'.
    Je pense que ça marcherai mais j'ai pas encore testé.
    Mais je suis obligé de passer par une Base DB2.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    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 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Si je comprends bien, le format est décrit dans une table DB2, et peut donc varier selon les lignes ?
    On peut donc avoir une première ligne avec un format 'NNNN A" pour reprendre ton exemple, puis une autre avec 'AA NN AAA' par exemple ?

    Si tel est bien le cas, il faut d'abord analyser la longueur de la zone, puis faire une boucle qui analysera chaque octet unitairement.

    Sinon, pour les 88, il faut des noms différents pour chaque occurrence, ils ne peuvent pas tous s'appeler "Value-Correct"

  3. #3
    Membre averti Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Points : 346
    Points
    346
    Par défaut
    Bonjour,

    La longueur sera un char de 6.
    On pourrait avoir 'NNNNNA', ' AAA', 'NANANA', 'AANN N', ....

    Et oui je suis d'accord avec toi pour les 88. Sera Value-Correct-1-ERE-LIGNE, Value-Correct-2-EME-LIGNE, ...

    J'ai crée ce poste pour savoir si vous ne connaissiez pas de méthodes plus propre pour faire ça.

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 803
    Points : 32 058
    Points
    32 058
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    88 Value-Correct Value ' ', 'A' THRU 'Z', 'a' THRU 'z'.
    C'est de l'ASCII ou de l'EBCDIC? Parcequ'en EBCDIC, les lettres sont disjointes dans la table des caractères. Donc ça va laisser passer plein de caractères spéciaux(rares, certes, mais qui prendra le risque?).

    Pour le coup, je ferais une procédure dédiée. Du genre :

    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
        77 FORMATAGE PIC X(6).
        77 CHAINE PIC X(6).
    
    (.../...) 
        MOVE "AAAA N" TO FORMATAGE 
        MOVE "ABrt 8" TO CHAINE
        PERFORM MA-PROCEDURE
           THRU MA-PROCEDURE-FIN
    (.../...)
    
    MA-PROCEDURE.
        PERFORM VARYING I FROM 1 BY 1 UNTIL I > LENGTH OF FORMATAGE
            SELECT CASE FORMATAGE( I : 1 )
                CASE "N"
                    IF NOT ISNUMERIC(FORMATAGE( I : 1 )) THEN PERFORM ERREUR THRU ERREUR-FIN
                CASE "A"
                    (.../...) j'ai la flemme de coder a-z A-Z
            END-SELECT
        END PERFORM
        .
    MA-PROCEDURE-FIN.
        EXIT.
    Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
    1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
    2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
    3)le temps de comprendre toutes les exigences, le projet est terminé
    4)le temps de terminer le projet, les exigences ont changé
    Et le serment de non-allégiance :
    Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    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 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    D'accord avec cette proposition, à la réserve près du perform THRU qui n'apporte rien, alourdit le code et présente le gros inconvénient d'être la porte ouverte à de futur GO TO

    En ce qui me concerne je ne code jamais cette instruction et je milite contre son usage

  6. #6
    Membre averti Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Points : 346
    Points
    346
    Par défaut
    Merci à tous pour votre aide.

    Je pense que finalement le mieux c'est de passer par un bon vieux PERFORM VARYING.

  7. #7
    Membre averti Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Points : 346
    Points
    346
    Par défaut
    Bonjour,

    Je rouvre mon poste pour donner la solution que j'ai mis en place.
    Histoire que ça serve à d'autres ou que vous me donniez votre avis.
    J'ai mis ça dans le Working :
    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
           01  W-CHAR-POSITION                  PIC 9(04).
           01  W-CARACTERE-A-TESTER             PIC X(1).
           01  W-ALPHANUMERIC                   PIC X(1).
               88 W-IS-ALPHANUMERIC              VALUE 'O'.
               88 W-IS-NOT-ALPHANUMERIC          VALUE 'N'.
           01  W-FORMAT-CHAR                    PIC X(1).
               88 W-FORMAT-CHAR-ALPHANUM         VALUES 'A', 'B', 'C', 'D',
                                                        'E', 'F', 'G', 'H',
                                                        'I', 'J', 'K', 'L',
                                                        'M', 'N', 'O', 'P',
                                                        'Q', 'R', 'S', 'T',
                                                        'U', 'V', 'W', 'X',
                                                        'Y', 'Z',
                                                        '0', '1', '2', '3',
                                                        '4', '5', '6', '7',
                                                        '8', '9',
                                                        SPACE.
               88 W-FORMAT-CHAR-LETTRE           VALUES 'A', 'B', 'C', 'D',
                                                        'E', 'F', 'G', 'H',
                                                        'I', 'J', 'K', 'L',
                                                        'M', 'N', 'O', 'P',
                                                        'Q', 'R', 'S', 'T',
                                                        'U', 'V', 'W', 'X',
                                                        'Y', 'Z'.
               88 W-FORMAT-CHAR-CHIFFRE          VALUES '0', '1', '2', '3',
                                                        '4', '5', '6', '7',
                                                        '8', '9'.
               88 W-FORMAT-CHAR-SIGNE            VALUES '-', '+'.
               88 W-FORMAT-CHAR-ESPACE           VALUE SPACE.
               88 W-FORMAT-CHAR-ERREUR           VALUE  '$'.
    Et voici le CODE Cobol associé :
    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
          *----------------------------------------------------------------*
           CTRL-FORMAT.
          *-------------------
                  PERFORM VARYING W-CHAR-POSITION FROM 1 BY 1
                  UNTIL W-CHAR-POSITION > LENGTH OF W-FORMAT-VAL (=> W-FORMAT-VAL est une représentation des type caractère par caractère. Exemple '+ANLLB')                                             OR W-FORMAT-CHAR-ERREUR
    
                     MOVE W-VAL-A-ANALYSER(W-CHAR-POSITION:1)        (=> W-VAL-A-ANALYSER représente une valeur à valider).                                          TO W-FORMAT-CHAR
    
                     EVALUATE W-FORMAT-VAL (W-CHAR-POSITION:1)
                        WHEN 'A'
                          IF NOT W-FORMAT-CHAR-ALPHANUM
                            SET W-FORMAT-CHAR-ERREUR TO TRUE
          *                 RENSEIGNEMENT DE L'ERREUR.
                             ...
          *                 LOG ERREUR
                            PERFORM ECRITURE-FICHIER-TRT-EN-ERREUR
                          END-IF
                        WHEN 'L'
                          IF NOT W-FORMAT-CHAR-LETTRE 
                             ...

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 767
    Points : 10 764
    Points
    10 764
    Par défaut
    Bonjour, ta méthode est plutôt élégante

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    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 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Tu aurais pu te simplifier la vie en utilisant des niveaux 88 avec des plages de valeurs : values are 'A' THRU 'Z' par exemple

    Attention aussi au dépassement de capacité de la variable W-CHAR-POSITION définie en 9(4) alors que les chaines examinées peuvent faire plus de 4 caractères

    Enfin, pour des raisons de performances, tu devrais déclarer les indices en binaire, ca semble un point de détail, mais en cobol, le binaire est en moyenne 8 fois plus rapide que l'étendu (le packé est également plus performant que l'étendu mais dans une moindre mesure)

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 767
    Points : 10 764
    Points
    10 764
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Enfin, pour des raisons de performances, tu devrais déclarer les indices en binaire, ca semble un point de détail, mais en cobol, le binaire est en moyenne 8 fois plus rapide que l'étendu (le packé est également plus performant que l'étendu mais dans une moindre mesure)
    Honnêtement des indices en binaire je ne crois pas en avoir vu passer sur mon site actuel ou le précédent (même sur de très vieux programmes). Pour du débugging en cas de plantage, le binaire ne facilite quand même pas la vie ...

  11. #11
    Membre averti Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Points : 346
    Points
    346
    Par défaut
    Merci beaucoup pour vos avis. ça me réconforte dans l'idée que je n'ai pas fais de la ...

    J'avais bien mis "values are 'A' THRU 'Z'" au départ mais il y avait des points difficiles que je n'ai pas pu résoudre précisément.

    C'est le problème d'encodage. De base je n'ai pas réussi à savoir l'encodage du compilateur cobol.
    Le 'A' THRU 'Z' marche en Unicode mais pas forcement ailleurs.

    Maintenant disons que c'est de l'Unicode, ça implique de devoir mettre des PIX N() au lieux des PIC X() pour coder sur deux octets. (un peu spé)

    Enfin disons qu'un programme encodé différemment fait un CALL sur mon programme. Je récupère quoi en linkage ? L'encodage du programme de base ou de l'Unicode ?

    Comment être sûr que 'A' THRU 'Z' marchera dans 100% des cas ?

    Bref, j'ai préféré mettre les valeurs en dur à cause de ça.

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    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 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Darkzinus Voir le message
    Honnêtement des indices en binaire je ne crois pas en avoir vu passer sur mon site actuel ou le précédent (même sur de très vieux programmes). Pour du débugging en cas de plantage, le binaire ne facilite quand même pas la vie ...
    Le débugging ne pose pas de problème, la plupart des déboggueurs, sans doute même tous aujourd'hui, affichent automatiquement en format lisible quelque soit le format réel.
    Les dumps aussi peuvent être formatés et lisibles.

    C'est donc dommage de pénaliser les perfs en utilisant des formats de données inappropriés.

    Bien sur on pourra objecter que sur un mainframe, la plupart des traitements passent beaucoup plus de temps en I/O qu'en calcul, ce qui est vrai, mais toute source de performance est bonne a prendre sous réserve qu'elle ne pénalise pas la maintenance .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Regular Expression (Regex) syntax avec C#.NET
    Par paca_mike dans le forum C#
    Réponses: 4
    Dernier message: 24/03/2009, 21h54
  2. [Regular expression] Possessive quantifiers
    Par Pragmateek dans le forum Langage
    Réponses: 1
    Dernier message: 24/06/2006, 12h55
  3. [debutant] Regular Expression
    Par absolut75 dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 13/06/2006, 01h43
  4. [RegEx] Empty regular expression
    Par Khrysby dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2006, 22h25
  5. [Regular Expressions] Numérotation romaine
    Par ramalho dans le forum Valider
    Réponses: 3
    Dernier message: 24/02/2004, 17h43

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