1. #1
    Membre du Club
    Inscrit en
    mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : mai 2008
    Messages : 187
    Points : 51
    Points
    51

    Par défaut [AS/400] unstring et string

    Bonjour,
    j'ai un fichier contenant une dizaine de chaines de caractères (une par ligne). Je dois "décortiquer" chaque chaine de caractère et récupérer différentes informations, ensuite je dois recomposer une nouvelle chaine de caractère et l'écrire dans un autre fichier.
    Je n'ai aucun problème pour récupérer une chaine de caractère de mon fichier et écrire la nouvelle chaine dans le deuxième fichier mais j'ai des problèmes pour "décortiquer" la chaine.

    Chaque chaine (une ligne) présente dans le fichier est représentée de la facon suivante: UN OU PLUSIEURS BLANCS suivis de DEUX CARACTERES NUMERIQUES suivis de "***" suivi de DIX CARACTERES MAXIMUM suivi de "--" suivi de UN OU PLUSIEURS ESPACES suivis de HUIT CARACTERES NUMERIQUES
    ex:
    " 10 ***MACHAINEEE-- 12345678"

    J'aimerais récupérer les trois données et les placer dans des variables à l'aide de UNSTRING: "10" dans CPT, "MACHAINEEE" dans CHAINE et "12345678" dans NOMBRE.

    Pouvez vous m'aider? Merci!

  2. #2
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    juin 2007
    Messages
    2 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : juin 2007
    Messages : 2 056
    Points : 4 038
    Points
    4 038

    Par défaut

    Bonjour.

    Voici un petit exemple en ILE 400, il y a sûrement d'autres possibilités. Une petite boucle ferait l'affaire aussi.
    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
    42
    43
    44
    45
    0002   IDENTIFICATION DIVISION.
    0008   PROGRAM-ID. ALEX.
    0009   AUTHOR. H. JAIDANE.
    0010   ENVIRONMENT DIVISION.
    0011   CONFIGURATION SECTION.
    0012   SOURCE-COMPUTER. IBM-AS400.
    0013   OBJECT-COMPUTER. IBM-AS400.
    0014   SPECIAL-NAMES.
    0015                  DECIMAL-POINT IS COMMA
    0016                  LOCAL-DATA IS LOCALDATA
    0017                  REQUESTOR IS MONTERMINAL.
    0018   INPUT-OUTPUT SECTION.
    0019   FILE-CONTROL.
    0032   DATA DIVISION.
    0033   FILE SECTION.
    0050   WORKING-STORAGE SECTION.
    0050   77  CHAINE pic x(35) value "   10***MACHINEEE--   12345678".
    0050   77  CHW    pic x(35).
           77  CH1    pic x(10).
           77  PTR    pic 9(4) comp-4.
           77  NBR    pic xx.
           77  NB1    pic xx.
           77  NB2    pic x(8).
    0201   PROCEDURE DIVISION.
    0202  0204   TRAITEMENT SECTION.
    0209   DEBUT.
               move 0 to PTR.
               inspect CHAINE tallying PTR for leading spaces.
               add 1 to PTR.
               unstring CHAINE into NB1 pointer PTR.
               display PTR "-" NB1 "/" upon MONTERMINAL.
          *
               add 3 to PTR.
               unstring CHAINE delimited by "--" into CH1 pointer PTR.
               display PTR "-" CH1 "/" upon MONTERMINAL.
          *
               unstring CHAINE into CHW pointer PTR.
               move 0 to PTR.
               inspect CHW tallying PTR for leading spaces.
               add 1 to PTR.
               unstring CHW into NB2 pointer PTR.
               display PTR "-" NB2 "/" upon MONTERMINAL.
          *
    0210       stop run.
    Résultats de l'affichage :
    0006-10/
    0020-MACHINEEE /
    0012-12345678/

  3. #3
    Membre du Club
    Inscrit en
    mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : mai 2008
    Messages : 187
    Points : 51
    Points
    51

    Par défaut

    Merci pour ton aide! J'ai néanmoins quelques petits problèmes à régler.
    Le premier nombre (nb1 dans ton programme) peut être également suivi de quelques espaces et MACHAINE peut être séparée par un espace (MA CHAINE SEPAREE) et peut être terminée par plusieurs espaces (avant --) que j'aimerais supprimer(mais je pense que ce cas ne pose pas de problème vu qu'on a le délimiteur --, prenons l'exemple de "chaine à décortiquer" suivant:

    " 08 ***MA CHAINE SEPAREE --12340692 "

    Je pensais pouvoir rajouter ceci au code, pour récupérer la ch1, mon problème est: est ce que les espaces seront considérés comme des CHARACTERS et bien comptés?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     MOVE 0 TO PTR
     INSPECT CHAINE TALLYING PTR FOR CHARACTERS BEFORE INITIAL "***"
     ADD 4 TO PTR
     UNSTRING CHAINE DELIMITED BY "--" INTO CH1TEMP 
                      WITH POINTER PTR
    Pourriez vous tester mon code et me dire s'il y a des erreurs?

    Merci d'avance.

  4. #4
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    juin 2007
    Messages
    2 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : juin 2007
    Messages : 2 056
    Points : 4 038
    Points
    4 038

    Par défaut

    Citation Envoyé par alex2746 Voir le message
    ...Pourriez vous tester mon code et me dire s'il y a des erreurs?

    Merci d'avance.
    Bonjour.

    Maintenant c'est à toi de jouer
    Inspire toi de l'exemple que je tai donné et adapte le à tes besoins.
    Si tu n'as pas d'AS/400 disponible, voici un site sur lequel tu peux t'inscrire gratuitement et utiliser un AS/400 à volonté : http://www.rzkh.de/english/indexeng.html

    Bonne continuation.

  5. #5
    Membre du Club
    Inscrit en
    mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : mai 2008
    Messages : 187
    Points : 51
    Points
    51

    Par défaut

    Merci pour le lien, je me suis inscrit et ça m'a bien aidé.
    Il me reste un dernier petit problème que je n'arrive pas à résoudre.

    Apriori, je ne connais pas la longueur de "MACHAINEE", je sais juste qu'elle fait maxium 40 caractères, c'est pour celà qu'on la déclare donc en PIC X(40).
    Seulement, par après je doit éditer une nouvelle ligne dans un fichier du genre :
    "01 MACHAINEE 12345678",
    mon problème est que ayant déclaré en PIC X(40) l'édition dans le fichier se fait comme suit:
    "01 MACHAINEE ^^^^^^^^^^^^^^^^^^^^ 12345678"
    (les ^ étant les blancs de fin de zone)

    Je n'arrive pas à supprimer ces blancs de fin de zone...

    Une idée?

    Merci d'avance!

  6. #6
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    juin 2007
    Messages
    2 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : juin 2007
    Messages : 2 056
    Points : 4 038
    Points
    4 038

    Par défaut

    Citation Envoyé par alex2746 Voir le message
    ...
    mon problème est que ayant déclaré en PIC X(40) l'édition dans le fichier se fait comme suit:
    "01 MACHAINEE ^^^^^^^^^^^^^^^^^^^^ 12345678"
    (les ^ étant les blancs de fin de zone)

    Je n'arrive pas à supprimer ces blancs de fin de zone...

    Une idée?

    Merci d'avance!
    - Si ta "MACHAINEEE" ne contient pas d'espaces au milieu tu peux faire un STRING DELIMITED BY SPACE,
    - Sinon au moment de faire le UNSTRING DELIMITED BY "--" tu insères un "/" avec DELIMITER IN et tu l'utilses dans le STRING DELIMITED BY "/". Une autre solution, dans ce dernier cas, consiste à compter les espaces à la fin de chaine en faisant une boucle perform varying en commençant par la fin de la chaine et puis tu utilises une reference modifier machaine(1:n), n = Long chaine - nbre espaces de fin.

    Regarde dans le site Infocenter d'IBM les docs pdf et descends le Cobol Reference (gratuit), il y a un tas d'explications et d'exemples.
    http://publib.boulder.ibm.com/infoce...v5r4/index.jsp

  7. #7
    Membre confirmé Avatar de Homer-ac
    Profil pro
    Inscrit en
    octobre 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2007
    Messages : 449
    Points : 576
    Points
    576

    Par défaut

    Une autre solution, dans ce dernier cas, consiste à compter les espaces à la fin de chaine en faisant une boucle perform varying en commençant par la fin de la chaine et puis tu utilises une reference modifier machaine(1:n), n = Long chaine - nbre espaces de fin.
    J'avais déjà signalé un 'truc' plus lite il me semble : la fonction REVERSE si disponible, qui permettra de passer les blancs de fin au début d'une zone de travail. Tellement simple qu'il me semble que c'est utile à rappeler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    If MY-DATA not = SPACE
       Move function Reverse(MY-DATA) to MY-DATA-WORK     
       Move 0  to WS-CNT                                         
       Inspect MY-DATA-WORK     Tallying WS-CNT For Leading space  
       Compute LONGUEUR-MY-DATA = length of MY-DATA-WORK  - WS-CNT
       Display MY-DATA(1:LONGUEUR-MY-DATA) ' SUITE .... '
    End-if
    La zone de travail doit être naturellement > ou = à celle d'origine

  8. #8
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    juin 2007
    Messages
    2 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : juin 2007
    Messages : 2 056
    Points : 4 038
    Points
    4 038

    Par défaut

    Citation Envoyé par Homer-ac Voir le message
    J'avais déjà signalé un 'truc' plus lite il me semble : la fonction REVERSE si disponible, qui permettra de passer les blancs de fin au début d'une zone de travail. Tellement simple qu'il me semble que c'est utile à rappeler...
    Bonjour.

    Et elle existe bien en ILE Cobol/400 à côté des fonctions TRIM, TRIML et TRIMR.

  9. #9
    Membre du Club
    Inscrit en
    mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : mai 2008
    Messages : 187
    Points : 51
    Points
    51

    Par défaut

    Merci beaucoup

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

Discussions similaires

  1. Convertir String numérique vers float AS/400
    Par fred33 dans le forum Langage
    Réponses: 3
    Dernier message: 23/04/2015, 08h31
  2. éliminer un caractere d'un string
    Par no-vice dans le forum Langage
    Réponses: 5
    Dernier message: 09/08/2002, 14h55
  3. URGENT: retour de string
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 15/07/2002, 09h47
  4. Réponses: 2
    Dernier message: 05/06/2002, 12h29
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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