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 :

Test ligne vide


Sujet :

Cobol

  1. #1
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut Test ligne vide
    Bonjour,

    Je souhaiterai savoir s'il est possible de tester si une ligne est vide en COBOL.
    Après mon autre sujet + pc-xp-percobol-lecture-sequentielle-fichier-tete/, j'ai vu que normalement les fichiers sont bien fixés à l'avance...
    Il n'y a donc JAMAIS de lignes vides dans "la vie réelle en COBOL" ?

    Enfin en gros pour essayer d'améliorer ce que je fais :
    1) fichier en entrée avec du texte et quelques lignes vides
    2) tri interne de ce fichier (en suivant l'aide de Hedhili)
    3) lecture du tri pour écrire en sortie

    J'aimerais avant d'écrire de vérifier si ma ligne est vide ou pas (chaque ligne est stockée dans un PIC X(100)... il n'y a qu'un seul champs en gros...)

    Merci d'avance !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  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 096
    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 096
    Points : 4 155
    Points
    4 155
    Par défaut
    Citation Envoyé par Metalman Voir le message
    Bonjour,

    Je souhaiterai savoir s'il est possible de tester si une ligne est vide en COBOL.
    On peut rencontrer des lignes (enregistrements) vides dans un fichier quelle que soit sa nature. Dans les fichiers de type texte quand 2 CR/LF se suivent, dans les fichiers d'organisation relative (direct, en gruyère) quand les rooms sont vides, dans les fichiers indexés quand les clés ne sont pas remplies par erreur et que le reste de l'enregistrement est aussi vide (cas rarissime).

    Comment les tester ? Tout dépend de comment les enregistrements ont été initialisés avant leur écriture, globalement par MOVE SPACES ou MOVE LOW-VALUE dans le niveau 01 du FD (le nom de l'enregistrement ou du format), ou zone par zone par des MOVE individuels ou l'instruction INTIALIZE. Cette instruction mets des 0 ou des espaces (pour simplifier à cause des types date/time) dans les zones élémentaires d'un groupe (niveau juste en dessous (supérieur) du niveau du groupe) en fonction de leur type.

    Pour simplifier : soit on teste le niveau 01 à SPACES ou à LOW-VALUE, soit chaque zone à 0 (ou ALL 0, ZEROS, ALL ZEROS), à SPACES ou à LOW-VALUE.

    Pour les fichiers texte, on teste à SPACES même si le CR/LF est en début de ligne.

    Je te laisse traduire tout ça.

  3. #3
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    C'est bon ça marche !
    Merci beaucoup !

    Voici les variables et la routine :

    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
            DATA DIVISION.
            FILE SECTION.
            FD  ENTER-DATA.
            01  IN-REC.
                05  SET-NAME                PICTURE X(100).
            SD  SORTED-DATA.
            01  SRT-REC.
                05  SORTED-NAME             PICTURE X(100).
            FD  OUT-DATA.
            01  OUT-REC.
                05  OUT-SET-NAME            PICTURE X(100).
    
            WORKING-STORAGE SECTION.
            01  ARE-THERE-MORE-RECORDS      PICTURE XXX VALUE 'YES'.
            77  CURRENT-NAME                PICTURE X(100).
            77  CURRENT-ENTRIES             PICTURE 999.
            01  IS-FIRST-ENTRY              PICTURE XXX VALUE 'YES'.
                88 NOT-FIRST-ENTRY                      VALUE 'NO '.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            300-WRITE-ROUTINE.
                IF  SRT-REC IS NOT = SPACES
                    IF  IS-FIRST-ENTRY = 'YES'
                        MOVE SORTED-NAME TO CURRENT-NAME
                        MOVE 1 TO CURRENT-ENTRIES
                        MOVE 'NO ' TO IS-FIRST-ENTRY
                    ELSE
                        ADD 1 TO CURRENT-ENTRIES
                        MOVE SORTED-NAME TO CURRENT-NAME
                    END-IF
                    MOVE CURRENT-NAME TO OUT-SET-NAME
                    WRITE OUT-REC
                END-IF.
    Il ne me manquait que le "IF SRT-REC IS NOT = SPACES" !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  4. #4
    Membre régulier
    Homme Profil pro
    Ingénieur d'étude Mainframe
    Inscrit en
    Septembre 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur d'étude Mainframe
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 61
    Points : 124
    Points
    124
    Par défaut
    En fait t'u navais pas besoin de programme pour ça

    Si tu utilises le JCL pour compiler/exécuter des programmes, tu peux le faire par JCL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //EXCLSPAC EXEC PGM=SORT
    //SORTIN    DD DSN=fichier.a.trier,DISP=SHR
    //SORTOUT   DD DSN=fichier.sortie.sans.ligne.vide,DISP=SHR
    //SYSOUT    DD *
    //SYSIN     DD *
    SORT FIELDS=COPY
    OMIT COND=(1,10,CH,EQ,C'          ')
    /*
    Vu que toute la ligne = 1 enregistrement tu peux même mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OMIT COND=(1,1,EQ,CH,C' ')
    Sinon, si tu sais combiner JCL et Assembleur (mais on sort du sujet, mais ça peut servir) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MODIF  CSECT
           USING   *,9
           CLC     0(1,11),=C' '
           BE      SUPPR1
           BR      15
    SUPPR1 BR      14
           END
    Et tu consultes le fichier issu de BR15, mais là assembleur/JCL je m'y connais moins pour savoir qui est quel fichier...

    assembleur tout seul ......... ok
    JCL tout seul ......... ok
    les deux ensemble ......... euh
    Voilà

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Avril 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 1
    Points : 4
    Points
    4
    Par défaut ligne (enregistrement) nulle
    Bonjour,
    il existe un autre moyen de tester le contenu "vide" d'un champ COBOL, il faut tester la longueur de son contenu.
    Exemple :
    un champ TOTO pic x(100).
    écrire l'instruction suivante

    MOVE LENGTH OF TOTO TO LONG (à définir en WSS)
    IF LONG = 0
    le contenu de TOTO est vide.

    ATTENTION :
    le contenu d'un enregistrement "vide" n'est pas obligatoirement à SPACES il peut aussi être à LOW-VALUE.

    Philippe

  6. #6
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Tout cela s'ajoute aux premiers posts en effet !

    Merci pour le complément d'informations (certes un peu tardif, mais pas inutile) !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  7. #7
    Membre régulier
    Homme Profil pro
    Ingénieur d'étude Mainframe
    Inscrit en
    Septembre 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur d'étude Mainframe
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 61
    Points : 124
    Points
    124
    Par défaut
    Citation Envoyé par philippe59250 Voir le message
    Bonjour,
    il existe un autre moyen de tester le contenu "vide" d'un champ COBOL, il faut tester la longueur de son contenu.
    Exemple :
    un champ TOTO pic x(100).
    écrire l'instruction suivante

    MOVE LENGTH OF TOTO TO LONG (à définir en WSS)
    IF LONG = 0
    le contenu de TOTO est vide.

    ATTENTION :
    le contenu d'un enregistrement "vide" n'est pas obligatoirement à SPACES il peut aussi être à LOW-VALUE.

    Philippe
    Hello, un peu tard mais juste une remarque :

    L'instruction LENGTH OF ne renvoie pas la taille maximale allouée par le programme ? (en l'occurence 100 pour l'exemple)

    Le plus simple serait de passer par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SET VIDE TO TRUE
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > LENGTH OF TOTO OR NON-VIDE
       IF TOTO(I:1) NOT = SPACES AND LOW-VALUE
          SET NON-VIDE TO TRUE
       END-IF
    END-PERFORM
    et de définir en WSS

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    01 STATUT-CHAINE PIC 9(1) VALUE 0.
      88 VIDE VALUE 1.
      88 NON-VIDE VALUE 0.
    
    01 I PIC 9(3).

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

Discussions similaires

  1. Test Ligne vide
    Par deniooo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/07/2008, 10h59
  2. effacer les lignes vides
    Par Samanta dans le forum Format d'échange (XML, JSON...)
    Réponses: 12
    Dernier message: 30/06/2005, 17h02
  3. TValueListEditor: Ajout automatique d'une ligne vide
    Par Patrick Seuret dans le forum C++Builder
    Réponses: 3
    Dernier message: 24/06/2005, 12h16
  4. [Unix] Purge de lignes vides (blanches)
    Par f@t@l error dans le forum Autres langages
    Réponses: 2
    Dernier message: 15/03/2005, 19h12
  5. [CR .NET] Table croisée: compléter avec lignes vides
    Par kartben dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 29/06/2004, 10h38

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