Précédent   Forum des professionnels en informatique > Systèmes > Autres systèmes > z/OS
z/OS Forum d'entraide sur z/OS et MVS (Multiple Virtual Storage), les systèmes d'exploitation des ordinateurs « mainframes » IBM : JCL, Tso, Ispf, Vsam, Racf, SMS, Cics, Ims, OPC, Ca-7, Control-M, Dialog Manager ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/01/2011, 18h07   #1
Invité de passage
 
damien rabich
Inscription : novembre 2010
Messages : 7
Détails du profil
Informations personnelles :
Nom : damien rabich

Informations forums :
Inscription : novembre 2010
Messages : 7
Points : 0
Points : 0
Par défaut Programme en REXX

Sur MVS.
A partir d'un fichier séquentiel qui a cette forme :

Info1
texte1=données1,texte2,texte3
texte1=données2,texte4,texte5

Info2
texte1=données3,texte4,texte3

Info3
texte1=données4,texte2,texte6
texte1=données5,texte2,texte6
texte1=données6,texte2,texte6
...

Je voudrai à l'aide de procédure en REXX (j'ai essayé avec des dfsort,iceman, icetool etc.. je n'ai pas réussi à obtenir ce que je voulais) obtenir un fichier de sortie de la forme ci-dessous :

Info1,données1,données2
Info2,données3
Info3,données4,données4,données5
...

Auriez-vous des idées,solutions? J'ai cherché des docs sur le REXX mais il n'y en a pas tant que ça et je suis novice en la matière.

NB : les champs info* sont de type variable tout comme données*
le champ texte1= est fixe (13 caractères)

Merci d'avance.
Damien77200 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 07h24   #2
Membre actif
 
Baptiste GRISEL
Inscription : novembre 2009
Messages : 153
Détails du profil
Informations personnelles :
Nom : Baptiste GRISEL
Âge : 28

Informations forums :
Inscription : novembre 2009
Messages : 153
Points : 180
Points : 180
Bonjour,

Si tu as des délimiteurs dans tes données, c'est plutôt simple à faire. Il suffit de trouver la position de celui-ci et d'extraire tes données pour les concaténer et les écrire dans un fichier en sortie.
Lemmings1406 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 18h17   #3
Invité de passage
 
damien rabich
Inscription : novembre 2010
Messages : 7
Détails du profil
Informations personnelles :
Nom : damien rabich

Informations forums :
Inscription : novembre 2010
Messages : 7
Points : 0
Points : 0
Pour trouver le champ Info*, il se trouve toujours après les caractéres * (astérisque et blanc) en position 1 et 2
=> donc Info* est en position 3 de longueur variable.
Pour les champs données*, ils se trouvent toujours entre texte1= et ,

Auriez-vous une idée du code à utiliser en sachant cela?
Damien77200 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 15h15   #4
Membre actif
 
Baptiste GRISEL
Inscription : novembre 2009
Messages : 153
Détails du profil
Informations personnelles :
Nom : Baptiste GRISEL
Âge : 28

Informations forums :
Inscription : novembre 2009
Messages : 153
Points : 180
Points : 180
Ca ne me parait pas insurmontable comme rexx à faire. Quelques ordres pos, length et substr ainsi que quelques boucles do et des if. Je pense que ça peut faire l'affaire.

Es-tu novice en programmation, connais-tu le langage REXX?

J'aurai un peu de temps la semaine prochaine pour t'orienter de façon plus précise sur le code sauf si quelqu'un passe avant.
Lemmings1406 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2011, 20h45   #5
Invité de passage
 
Antoine
Inscription : janvier 2011
Messages : 3
Détails du profil
Informations personnelles :
Nom : Antoine

Informations forums :
Inscription : janvier 2011
Messages : 3
Points : 3
Points : 3
Par défaut Routines REXX

Bonjour Damien.
A priori vous n'êtes pas un spécialiste du REXX sinon votre demande, banale en ce domaine, n'aurait pas lieu d'être.
Pour faire court, REXX manipule des piles, votre fichier résultat doit donc être "monté" dans une pile. Ensuite chaque ligne de cette pile doit être manipulée pour conserver en mémoire les éléments (données) à extraire, afin de constituer un enregistrement composite.
Plusieurs fonctions permettent de manipuler les lignes de façon à extraire les éléments cherchés (PARSING).
Tip: WVAR1=WORD(FI.1,1) retourne dans WVAR1 le 1er mot de la 1ère ligne de la pile traitée (FI.1). Remarque: Dans une boucle si I est l'indice de balayage, on codera FI.I pour traiter la ligne I de la pile, sachant que FI.0 contient le nombre de lignes de la pile...

Bref, à voir votre fichier, voici l'algo qu'on pourrait écrire
Pour I=1 à FI.0
SI le caractère "=" n'est pas dans la ligne FI.I
SI WINFO n'est pas vide ALORS
écrire WINFO concaténé avec WDATA1 ...
RàB des données de travail (W...)
Récupération de WINFO
Init de l'indice de données (j)
FINSI
SINON
Eclater la ligne par rapport au signe "=" et au signe "," (donne donnéesx) ; j++; sauver dans la variable WDATA indicée par j
FINSI
FINPOUR
Ecriture de la pile de travail sur le fichier en sortie...
FIN

Mais je peux comprendre que vous restiez sur votre faim. Allez, je suis inscrit sur ce forum pour aider tout un chacun. De ce fait, je vous propose de vous donner demain le code complet de cette routine REXX (je ne travaille plus en télé-travail le soir, 30 ans ça suffit, donc il vous faudra attendre demain soir...). Je dis ça mais après manger, je vais me connecter sur le Z-os du boulot et je vais me taper cette routine... Que voulez-vous, on ne se refait pas ;=)
A plus tard...
BiTonio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2011, 16h10   #6
Invité de passage
 
damien rabich
Inscription : novembre 2010
Messages : 7
Détails du profil
Informations personnelles :
Nom : damien rabich

Informations forums :
Inscription : novembre 2010
Messages : 7
Points : 0
Points : 0
Merci pour ce début de réponse, mais j'avoue ne pas tout comprendre dans ta réponse BiTonio car effectivement je suis totalement novice dans ce langage.

Auriez-vous un exemple de code sur lequel je puisse m'appuyer..? Toutes ces explications me semblent abstraites et j'avoue avoir besoin de pratiquer pour comprendre...

Désolé pour cette réponse tardive mais si vous pouviez me donner un dernier coup de main...
Damien77200 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 12h31   #7
Membre du Club
 
Homme Bernard
Développeur et formateur Mainframe
Inscription : février 2007
Messages : 39
Détails du profil
Informations personnelles :
Nom : Homme Bernard
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Développeur et formateur Mainframe
Secteur : Conseil

Informations forums :
Inscription : février 2007
Messages : 39
Points : 67
Points : 67
Bonjour,

Voici un REXX qui devrait fonctionner (si j'ai bien compris la structure du fichier à traiter)

Code :
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
/* REXX <= obligatoire sur la premiere ligne d'un rexx !!                     */
/* Algorithme :                                                               */
/*  1) Lire le fichier de DDNAME DDE1                                         */
/*     Chaque enregistrement est charge dans un item E1.                      */
/*  2) Boucle sur l'ensemble des item E1.                                     */
/*  3) Pour chaque item E1.,                                                  */
/*     3a) si la chaine de caracteres correspondant a l'extraction de 4       */
/*         caracteres depuis la 3eme position vaut 'Info' alors               */
/*         3a1) incrementer le compteur de lignes                             */
/*         3a2) creer un nouvel item S1. valorise avec l'extraction des       */
/*              caracteres de E1 depuis le 3eme caractere                     */
/*     3b) sinon                                                              */
/*         3b1) determiner la position du signe '=' dans E1                   */
/*         3b2) determiner la position de la premiere virgule dans E1         */
/*         3b3) concatener a l'item S1. cree en 3a2) une virgule et le contenu*/
/*              de l'extraction de E1 depuis le signe = jusqu'a et y compris  */
/*              le dernier caractere avant la premiere virgule                */
/*  4) Ecrire dans un fichier de DDNAME DDS1 tous les item S1.                */
/******************************************************************************/
"Execio * DiskR DDE1 (Finis Stem E1."   /* etape 1 */                                 
                                                                                
l=0 /* initialiser a zero le compteur l */                                      
                                                                    
Do i=1 To E1.0 /* E1.0 correspond au nombre d'item E1. */           
   If Substr(E1.i,3,4)='Info'                                       
      Then Do                    /* etape 3a  */                    
             l=l+1               /* etape 3a1 */                    
             S1.l=Substr(E1.i,3) /* etape 3a2 */                    
           End                                                      
      Else Do                                       /* etape 3b  */ 
             PosEq=Pos('=',E1.i)                    /* etape 3b1 */ 
             PosV1=Pos(',',E1.i)                    /* etape 3b2 */ 
             S1.l=S1.l','Substr(E1.i,PosEq,PosV1-1) /* etape 3b3 */ 
           End                                                      
End                                                                 
"Execio * DiskW DDS1 (Finis Stem S1." /* etape 4 */                 
Exit
Il y a moins de code que d'explications (et encore j'aurais pu imbriquer des fonctions) mais quand on débute autant faire du pas à pas.

N'hésitez pas à me dire si je n'ai pas été assez clair.
BernardBZH est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h40.


 
 
 
 
Partenaires

Hébergement Web