COBOL - lignes de tailles variable

Statut
N'est pas ouverte pour d'autres réponses.

alleluia

Elite
voila comme moi je suis une burne, je cherche conseil aupres des connaisseurs:

Code:
On a un fichier de départ qui contient des lignes, les lignes commencent toutes par un @, les éléments sont sépare par un ; , il faut juste écrire dans un nouveau fichier tout ça sans les @ et les ;. 
  
Ca on y arrive sans problème, mais dans cette crasse de cobol il faut fixer la longueur des variables des le départ, et la variable qu’on utilise pour lire les lignes a donc une valeur fixe et la ligne elle pas, donc dans l’écriture, le saut de ligne se fait après le nombre de caractère qu’on a fixe et non apres les @. 
  
Ce serait tout con si on pouvait donner à la variable la longueur de la ligne et basta, mais bon on peut pas. Alors je sais pas si c’est plus simple de passer sous forme de tableau ou quoi. 
  
Ou alors on avait pensé faire caractère par caractère mais c’est trop lourd.
si kkun est assez intelligent ( ou masochiste) pour expliquer comment faire ici, qu il n hesite pas. Merci d'avance
 

dagibbon

Elite
la taille des strings est aussi limitée à 256 char? (c un peu loin le cobol...) sinon tu fais un buffer de 256 char, puis avec un baladeur tu fais mumuse comme si c'était un tableau... Mais le cobol...tsss :D GL hein ... Si j'ai encore le courage en rentrant ce soir je regarderai :wink:
 
1er
OP
alleluia

alleluia

Elite
probleme resolu par l'adjonction de "ORGANIZATION IS LINE SEQUENTIAL." mais nouveau probleme au niveau de l'extraction du dernier champ, celui ci s'obstine a etre vide ( le dernier champ est le prix, si on le lit d'une traite, il est vide, sio on le lit en 2 partie ( unites + decimales), les unites sont la, mais les decimales manquent)

A votre bon coeur mesdames, messieurs

Voici le code du programme:

Code:
       IDENTIFICATION DIVISION.
       PROGRAM-ID.                      program-prix.
      *Lacroix Sophie
      *Programme transformant un fichier en un autre.
      ******************************************************************
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       special-names.
           decimal-point is comma.
       
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT finput ASSIGN TO "C:\listprixcslux.txt"
                           ORGANIZATION IS LINE SEQUENTIAL.
                    SELECT foutput ASSIGN TO "C:\prix.txt".
      *****************************************************************
       DATA DIVISION.
       FILE SECTION.
       FD          finput.
       01  rec                          pic     x(150).
     
       FD          foutput.
       01          rec-out.
           03        cpt-out            pic     9(4). 
           03        catarticle-out     pic     x(40).
           03        marque-out         pic     x(40).
           03        description-out    pic     x(50).
           03        qte-out            pic S999999999 comp-3.
           03        prix-out           pic 9999999v99.
      *     03     unite-out           pic     9999999.
      *     03      decimal-out         pic     99.
       WORKING-STORAGE SECTION.
       01  FS-IN            PIC   XX.
                   88              EOF     VALUE '10'.
       01  liste.
           03        poubelle      pic     x(50). 
           03        catarticle    pic     x(40).
           03        marque        pic     x(40).
           03        description   pic     x(50).
           03        qte           pic     S999999999.
           03        prix          pic     9999999v99.
      *     03      unite           pic     9999999.
      *     03      decimal         pic     99.  
      *     03      reste           pic     x(50).
       01  cpt                     pic     9(4)    value zero.
       01  pause                   pic     x.  
             
      ******************************************************************
       PROCEDURE DIVISION.
       begin.
           perform ouverture
           perform traitement      until EOF
           perform  cloture
           stop run.
       ouverture.
           open input finput
                output foutput
           display "nouvelle presentation:"
           display "----------------------"
           display " "
           accept pause
           .
       traitement.
           
           read finput at end
           continue
           not at end

           unstring rec delimited by "@" or ";"
           into poubelle catarticle marque description qte prix
      *    unite decimal reste
           end-unstring           
           add 1 to cpt 
        
           move cpt to cpt-out
           move catarticle to catarticle-out
           move marque to marque-out
           move description to description-out
           move qte to qte-out
           move prix to prix-out
      *     move unite to unite-out
      *     move decimal to decimal-out 

           display cpt
      
           display " "
           display rec
           display "catarticle:  " catarticle
           display "marque:  "marque
           display "description:  "description
           display "qte:  "qte
           display "prix  " prix
      *     display "unite-prix:  "unite
      *     display "decimal-prix: " decimal
      *     display "reste:  "reste
           display "**************************************************"
           accept pause
           write rec-out after 1
           end-read
           .
      
       cloture.
           close finput foutput
           accept pause
           
           .
et un exemple du fichier source

Code:
@ Wireless Lan Accessories;3Com;Access Point 2000 WireLess Lan 11MBits/s;0;174.02 
@ Wireless Lan Accessories;3Com;Access Point OfficeConnect WireLess Lan 11MBits/s;0;80.49 
@ Wireless Lan Accessories;3Com;PCI AirConnect WireLess Lan 11MBits/s;0;126.01 
@ Wireless Lan Accessories;3Com;Pcmcia 11Mbps Wireless OfficeConnect XJack Antenna;0;88.66 
@ Destockage;Abit;SOCKA KT133A ATA100 KT7A;0;136.37
 
houla, c'est vieux le cobol... mais le problème ne viendrait pas lors de la découpe du fait que tudevrais traiter aussi la fin de ligne comme séparateur ou un truc comme ça ?

je sais plus du tout comme il fait quand il split une ligne.
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut