Documentation Utilisateur XSM
Note: Cette documentation s'applique à la dernière version XSM. Pour les versions précédentes, lancez XSM sans paramètre pour afficher l'aide et la liste des options supportées par la version.XSM V7.00 est exclusivement disponible en 64 bits. Les anciennes releases XSM 32 bits sont abandonnées.
Sommaire
- Introduction à XSM
- Activation de XSM
- Lancement de XSM
- Répertoires définis par les variables XSM_*_DIR
***
v7.00 ***
- Paramètres
- Syntaxe de la ligne de commande
- Exemples de tris : La meilleure façon de commencer !
- Job 1 : Un fichier texte
- Job 2 : Un fichier texte, redirection du flux stdout
- Job 3 : Un fichier texte, redirection des flux stdin,stdout
- Job 4 : Deux fichiers binaires, sortworks sur disques différents pour optimiser les I/O
- Job 5 : Deux fichiers binaires, filtrage des enregistrements par OMIT
- Job 6 : Un fichier texte type CSV à champs de longueur variable avec séparateur de champs
Regardez notre Démo illustrée - Job 7 : Un fichier binaire contenant des zones "Packed Decimal"
- Job 8 : Un fichier texte avec des champs dates au format 'mmjjaa', changement du pivot de siècle Y2K
- Job 9 : Plusieurs fichiers texte avec identification et élimination des doublons
- Job 10 : Copie d'un fichier avec éclatement sélectif sur plusieurs fichiers
- Job 11 : Tri d'un fichier avec éclatement sélectif sur plusieurs fichiers
- Job 12 : Tri/Fusion de fichiers et éclatement sélectif sur plusieurs fichiers
- Job 13 : "Tout en Un" : Fusion + Dédoublonnage + Skip Header + sortie sélective CSV
- Job 14 : Portage d'un step de JCL MVS avec XSM
- Tri Destructif et non destructifs
- Conseils pour les performances
- Utilisation de la librairie de programmation XSM (User Exit)
- Messages & Codes retour
- CHANGELOG
- FAQ
1. Introduction à XSM
XSM est un programme de tri, qui lit un ou plusieurs fichiers en entrée, trie toutes les lignes ou enregistrements d'après des critères, ou 'clés' de tri, définis par l'utilisateur, et écrit le résultat final sur un fichier de sortie, en applicant des filtres 'Inclure/Exclure' éventuels.
XSM peut trier 2 types de fichiers :
- Les fichiers à enregistrements de longueur fixe (RECFM=F), ou fichiers 'binaires' :
Toutes les lignes ou 'enregistrements' sont de même longueur, y compris le caractère de fin de ligne Carriage Return/Line Feed (DOS, Windows ...), ou Line Feed (UNIX), s'ils existent (CR et LF sont traités comme les autres caractères). -
Les fichiers texte à longueur variable, également nommés "fichiers plats" :
Chaque ligne est délimitée par un CR/LF (DOS, Windows, ...), ou un simple LF (UNIX).
Les critères de tri peuvent se trouver à des emplacements fixes (FIELDS), ou des champs de longueur variable, séparés par un caractère séparateur (FIELDSEP).
Le "parmfile" est principalement utilisé pour les paramètres statiques, tels que clés de tri, sortworks, et options.
Vous pouvez également spécifier les paramètres sur la ligne de commande, au lieu d'utiliser un "parmfile". Ceci est décrit ci-dessous à la section syntaxe de ligne de commande.
Ceci est principalement utilisé pour passer les paramètres variables, tels que noms de fichiers en entrée/sortie. Vous pouvez ainsi tirer partie des variables d'environnement dans des scripts batchs (shell UNIX, Windows .bat) pour passer à XSM les noms de fichiers en entrée/sortie.
Il est recommandé d'utiliser le parmfile associé à la ligne de commande :
- le parmfile contient toutes les définitions statiques, tels que clés de tris, les options de filtrage
*************** parameter file job1.xsm ********* SORT FIELDS=(14,7,C,A) ; une clé de tri : position 14, sur longueur 7, Charactères, Ascending RECORD RECFM=V,LRECL=200 ; format texte variable avec CR/LF, longueur max 200 car OMIT DUPKEYS ; raccourci de OMIT DUPLICATE KEYS : dédoublonne
- la ligne de commande contient les variables dynamiques, telles que noms de fichiers en entrée/sortie.
hxsm700 --verbose --inpfile=/data/fp1.dat --outfile=/data/fp1.sorted job1.xsm
Au lancement, XSM calcule automatiquement les meilleures valeurs de ressources mémoire et fichiers disques temporaires ("sortworks") à utiliser en fonction de la nature et taille des fichiers en entrée. Ainsi, dans la plupart des cas, aucun tuning n'est nécessaire à XSM.
XSM fonctionne par défaut en mode dit "destructif" pour privilégier les performance, à l'opposé du mode dit "non-destructif" ou "stable".
L'option KEEP_ORDER le rend non-destructif ou "stable".
Cf. explications "tri destructif/non-destructif" ci-dessous.
2. Activation de XSM
XSM est livré sous forme de binaire prêt à l'emploi : aucune installation
logicielle n'est nécessaire. Le package contient hxsm700 et le
programme d'activation hhnsinst.
Après extraction du package, rendez les programmes exécutables sous Linux ou AIX, puis activez XSM sur le système concerné :
chmod +x hxsm700 hhnsinst ./hhnsinst ./hxsm700
Sous Windows, lancez activate_xsm.bat, ou utilisez directement :
hhnsinst.exe hxsm700.exe
Vous pouvez ensuite déplacer hxsm700 et hhnsinst
dans le répertoire de votre choix, par exemple /usr/local/bin,
/opt/xsm ou un répertoire Windows présent dans PATH.
Une activation est liée au système sur lequel elle est réalisée. Si le binaire est copié sur un autre système, il doit être activé sur ce système.
3. Lancement de XSM
Le lancement de XSM est très simple :
1) Créez un fichier paramètres décrivant le travail à faire :
- quel(s) fichier(s) trier (à défaut de standard input)
- quel type de fichiers : Fixes ou Variables
- quels critères (ou "clés") de tri
- où écrire le résultat final (à défaut de standard output)
- quelles ressources utiliser : mémoires, espace disque ...
- les options éventuelles (filtre, dédoublonnage, ...)
2) A l'invite (Terminal UNIX ou fenêtre invite Windows cmd.exe) du système, entrez :
hxsm700 votre-parmfile
3) Option -v 'Verbose':
On peut suivre le déroulement du tri, avec la durée de chaque phase avec le l'option -v (verbose) ou -vv (very verbose):
hxsm700 -vv votre-parmfile
4) Option -c 'Check' :
Pour contrôler, une fois le tri terminé, que le fichier en sortie est correctement trié selon les critères du fichier de paramètres:
hxsm700 -v -c votre-parmfile
A noter que l'on peut spécifier la plupart des paramêtres sous forme d'options traditionnelles sur la ligne de commande, sans utiliser de parmfile. Cela est utile pour passer les noms de fichiers en entrée/sortie provenant de variables d'environnement.
La section suivante décrit les paramètres du parmfile.
Pour une prise en main rapide, consultez les Exemples de tris ci-dessous.
Pour afficher l'aide, lancez
hxsm700 ou hxsm700 -h ou hxsm700 --help
Pour afficher uniquement la version du programme :
hxsm700 --version
Répertoires définis par les variables XSM_*_DIR
***
v7.00 ***
XSM V7.00 permet de séparer simplement le programme, les parmfiles, les données en entrée, les résultats et les fichiers temporaires :
XSM_PARM_DIR: répertoire contenant les parmfiles ;XSM_INPUT_DIR: préfixe des fichiers en entrée ;XSM_OUTPUT_DIR: préfixe des fichiers en sortie ;XSM_SORTWORKS_DIR: un ou plusieurs répertoires de travail, séparés par une virgule.
Lorsque l'une de ces variables est définie, le nom correspondant donné à
XSM doit être un nom simple, sans chemin. Les répertoires doivent exister avant
le lancement. Un paramètre SORTWORKS ou une option
--sortwork explicite est prioritaire sur
XSM_SORTWORKS_DIR.
Exemple Linux/AIX :
export XSM_PARM_DIR=/opt/xsm/parmfiles export XSM_INPUT_DIR=/data/in export XSM_OUTPUT_DIR=/data/out export XSM_SORTWORKS_DIR=/work1/xsm,/work2/xsm hxsm700 -vv job01.xsm
Exemple Windows :
set "XSM_PARM_DIR=C:\XSM\parmfiles" set "XSM_INPUT_DIR=D:\data\in" set "XSM_OUTPUT_DIR=D:\data\out" set "XSM_SORTWORKS_DIR=E:\xsmwork,F:\xsmwork" hxsm700.exe -vv job01.xsm
Avec ces exemples, la ligne de commande utilise seulement
job01.xsm. Dans le parmfile, utilisez par exemple
INPFIL customers.dat et OUTFIL customers.sorted :
XSM construit les chemins complets à partir des variables.
4. Paramètres
XSM lit ses paramètres depuis un simple fichier texte. Nous l'appelons "Fichier Paramètres" ou "parmfile".Si vous préférez ne pas utiliser de parmfile, dans la plupart des cas les paramètres peuvent être spécifiés sur la ligne de commande.
Le fichier paramètres est une suite de lignes de paramètres du type :
SORT/MERGE - obligatoire si pas d'OPTION COPY
RECORD - obligatoire
INPFIL - optionnel
OUTFIL - optionnel
OUTREC - optionnel
INCLUDE - optionnel
EXCLUDE|OMIT - optionnel
OUTFILDUP - optionnel
SORTWORKS - optionnel
IOERROR - optionnel
STORAGE - optionnel
OPTION - optionnel
Les instructions peuvent commencer en n'importe quelle colonne, mais il est conseiller de commencer en colonnes 1 à 8 pour la lisibilité.
Les marques de commentaires sont :
- un point-virgule
(;)en n'importe quelle colonne de la ligne,
- ou un Astérisque
(*)en début de ligne,
- ou un Dièse
'#'en début de ligne.
# ceci est un commentaire * ceci est un commentaire ; ceci est un commentaire INPFIL /tmp/data/myinput.file ; ceci est un commentaire pour le fichier en entrée
Les lignes de commentaires ainsi que les vides sont permises n'importe où dans le fichier de paramètres.
Le paramètre SORT/MERGE
SORT ou MERGE FIELDS=(pos,long,type,direction[,pos,long,type,direction,..])
ou
FIELDS=(pos,long,direction[,pos,long,direction,..]),FORMAT=type
ou
FIELDS=ALL
ou
VFIELDS=(pos,long,type,dir.[,pos,long,type,dir.,..]),FIELDSEP=car
pos : position de début d'une clé de tri (pour FIELDS=)
rang de la clé de tri (pour VFIELDS=)
long : longueur de cette clé (pour FIELDS=)
longueur maximum de cette clé (pour VFIELDS=)
type : B ou BI (Binary) - champ binaire
C ou CH (Char) - en caractères classique ascii (par défaut)
I (Ignore Case) - champ alphanumérique,
ne pas différencier minuscules/Majuscules
N ou NU (Numeric) - champ considéré comme numérique :
caractères '0'..'9' (VFIELDS seulement)
P ou PD (Packed) - Décimal Packé
(Binary files only, last half Byte = sign)
Y ou Y2K - champ numérique de 2 octets contenant le millésime (les dizaines)
d'une date (AA) : contient '84' pour l'année 1984. L'année de
pivot (option Y2KSTART, 1970 par défaut) sert à déterminer
si une année, par exemple 17, signifie 1917 ou 2017. (cf Y2K faq)
direction : A (Ascending order), D (Descending order)
FORMAT : forme simplifiée utilisée seulement lorsque toutes les clés de tri ont le même type
Ainsi on peut simplifier
SORT FIELDS=(14,10,CH,A,24,10,CH,A)
en :
SORT FIELDS=(14,10,A,24,10,A),FORMAT=CH
FIELDSEP : Le délimiteur/séparateur de champs FIELDSEP peut être un nom symbolique, un simple
caractère, ou une valeur hexadécimale.
L'utilisation de noms symbolique est recommandée pour la ponctuation générale, pour
éviter des erreurs d'analyse de syntaxes, spécialement avec des séparateurs ';', '#'.
Noms Symboliques acceptés :
BAR = the '|' char
TAB = the Tabulation (X'09') char
COMMA = the ',' char
COLUMN = the ':' char
DIARESIS = the '#' char
SLASH = the '/' char
BACKSLASH = the '\' char
SEMICOLUMN or SEMI-COLUMN = the ';' char
SINGLEQUOTE or SINGLE-QUOTE = the "'" char
DOUBLEQUOTE or DOUBLE-QUOTE = the '"' char
Valeur Hexadécimale : X'hh'
(Hex syntax : UPPERCASE X, Singlequote, 2 Hex digits,Singlequote)
La valeur par défaut est la Tabulation
Exemples :
VFIELDS=(.....),FIELDSEP=SEMI-COLUMN
VFIELDS=(.....),FIELDSEP=@
VFIELDS=(.....),FIELDSEP= ; FIELDSEP est l'espace ou "blanc"
VFIELDS=(.....),FIELDSEP=X'7C'
VFIELDS=(.....) ; FIELDSEP=TAB par défaut
Paramètre équivalent ligne de commande : --sort / --merge --key=
On utilise le verbe SORT pour trier un ou plusieurs fichiers.
On utilise le verbe MERGE pour fusionner au moins deux fichiers déjà triés.
Pour bien comprendre la différence entre SORT et MERGE, consultez la discussion SORT/MERGE.
L'un ou l'autre des paramètres SORT ou MERGE est obligatoire, sauf si l'OPTION COPY est utilisée.
Le paramètre FIELDS= décrit les champs (ou clés) de tri à des position fixes sur la ligne (RECFM=V) ou l'enregistrement (RECFM=F).
FIELDS=ALL indique que la clé de tri est la ligne entière ou l'enregistrement entier.
Le paramètre VFIELDS décrit les clés de tri à longueur variable séparées par un caractère donné.
Ce paramètre ne peut pas être utilisé pour les fichiers binaires (RECFM=F).
Avec le paramètre VFIELDS, on spécifie le séparateur de champs avec FIELDSEP= (cf. ci-dessus).
SORT FIELDS=(17,3,B,D,1,15,B,A)
ou
SORT FIELDS=(17,3,BI,D,1,15,BI,A)
ou
SORT FIELDS=(17,3,D,1,15,A),FORMAT=BI
Ils signifient :
- la 1ère clé commence en colonne 17 de chaque enregistrement, sur une longueur de 3, donc se termine en colonne 17 + 3 - 1 = 19, type Binaire, tri Descendant,
- la 2nde clé commence en colonne 1, sur une longueur de 15, donc se termine en colonne 1 +1 5 - 1 = 15, type Binaire, tri ascendant.
SORT FIELDS=(2,4,B,A) ; trie un entier binaire sur 4 octets en ordre Descendant SORT FIELDS=(6,2,B,D) ; trie un entier binaire sur 2 octets en ordre Ascendant SORT FIELDS=(2,8,B,A) ; trie un long (8x8=64 bits) en ordre Descendant (fichier créé sur OS 64-bits)
Tri d'un fichier texte sur un nom de colonne 12 à 31 (12 + 20 - 1 = 31), ignorer la 'casse' :
SORT FIELDS=(12,20,I,A)
Tri d'un fichier binaire sur un nombre 'Packed Decimal', col. 7-10, ordre inverse :
SORT FIELDS=(7,4,P,D) ; 7 BCD digits, signé
Tri d'un fichier de texte, champs variables, séparateur ':'
- un nom dans le champ 12, longueur maxi 20 caractères, ignorer la 'casse';
- un nombre dans le champ 7, au plus 9 chiffres (car. '0' .. '9'), ordre inverse
SORT VFIELDS=(12,20,I,A,7,9,N,D),FIELDSEP=:
Idem avec un espace en guise de séparateur :
SORT VFIELDS=(12,20,I,A,7,9,N,D),FIELDSEP=
Idem avec une tabulation en guise de séparateur :
SORT VFIELDS=(12,20,I,A,7,9,N,D),FIELDSEP=TAB
ou
SORT VFIELDS=(12,20,I,A,7,9,N,D) ; FIELDSEP=TAB implied (défaut)
Tri d'un fichier de texte avec date de la forme 'mmjjaa', colonne 21-26, ordre décroissant
SORT FIELDS=(25,2,Y,D,21,2,B,D,23,2,B,D)
Tri d'un fichier de texte tel quel, sur toute la ligne :
SORT FIELDS=ALL
Voir des exemples de jobs XSM
Le paramètre RECORD
RECORD RECFM=record format,LRECL=record length
record format : F pour longueur fixe
V pour longueur variable
T pour du Texte (V et T sont équivalents)
M pour du MicroFocus "MFCOBOL"" ou "MFVariable"
record length : Longueur exacte d'enregistrement pour RECFM=F, y compris un évenutel séparateur CR/LF
Longueur max. d'enregistrement pour RECFM=V, sans compter le séparateur de ligne CR/LF
Paramètre équivalent ligne de commande : --recfm= --lrecl=
Le paramètre RECORD indique si le format d'enregistrement est fixe ou variable, et sa longueur.
Le paramètre RECORD est obligatoire.
Avec RECFM=V, LRECL est automatiquement incrémenté de 2 pour inclure CR/LF (fichiers plats Windows/UNIX)
RECFM=M est utilisé pour le format spécial Microfocus Variable Format Record Sequential File
connu sous le nom "MFCOBOL" ou "MFVariable", composé :
- d'un header 128 octets
- d'une suite de records [ Header ][ Variable length data ][ Padding ].
- d'une suite de records [ 4 Bytes Record Descriptor Word (RDW) header ][ Variable length data ]
Pour trier des fichiers de format Variable IBM Mainframe reçus par FTP de DOS/VSE, MVS, z/VM, z/OS :
- Transfert FTP ASCII, Quote site NORDW (par défaut) :
Une fois transférés sous Unix/Windows, les fichiers sont en format texte ASCII, enregistrements de longueur variable avec CR/LF, sans le RDW.
Pour XSM, indiquer RECORD RECFM=V,LRECL=xxxx (xxxx = la longueur max des records) - Transfert FTP ASCII, Quote site RDW :
Une fois transférés sous Unix/Windows, les fichiers sont en fomat texte ASCII, enregistrements de longueur variable terminés par CR/LF, préfixés par le RDW (en binaire).
Pour XSM, indiquer RECORD RECFM=V,LRECL=xxxx (xxxx = la longueur max des records) et décaler (rajouter +4) toutes les positions des clés de tri. - Transfert FTP Binaire, sans RDW:
N'a pas de sens car on ne connait plus la longueur des enregistrements.
- Transfert FTP Binaire, avec RDW:
Non supporté par XSM.
Exemples :
RECORD RECFM=F,LRECL=400
signifie que tous les enregistrements sont de même taille (400 octets, y compris les CR/LF éventuels)
La taille du(des) fichier(s) en entrée est forcément un multiple de 400.
RECORD RECFM=V,LRECL=133
signifie qu'il s'agit d'un fichier de texte, dont les lignes font 133 caractères au maximum (sans compter CR/LF);
Voir des exemples de jobs XSM
Le paramètre INPFIL
Forme 1 :
INPFIL filename
filename : nom du fichier en entrée
Paramètre équivalent ligne de commande : --infile=
Forme 2 :
INPFIL DD:varname
varname : Variable d'environnement contenant le nom du fichier en entrée
Le paramètre INPFIL indique le nom des fichiers en entrée.
Le paramètre INPFIL est optionnel. Si absent, 'standard input' (stdin) est utilisé pour le fichier en entrée (les redirections et pipe UNIX sont permises).
Une ligne INPFIL par fichier en entrée
A partir des versions 4.50/5.10, les fichiers peuvent être spécifiés "à la MVS" par un DDname : DD:variable
Dans ce cas, XSM récupère le nom du fichier via la variable d'environnement correspondante.
INPFIL C:\Myjob\BIGF.INP # Windows INPFIL D:\TMP\Wrk.Dat # Windows INPFIL /home/hh/bigf.inp # UNIX INPFIL /home/hh/littlef.inp # UNIX INPFIL DD:SORTIN1 # any systems INPFIL DD:SORTIN2 # any systems INPFIL DD:JOHNNY # any systems # SORTIN1 SORTIN2 et JOHNNY sont les variables d'environnement contenant les noms de fichiers.
Voir des exemples de jobs XSM
Le paramètre OUTFIL
Le paramètre OUTFIL indique le nom des fichiers en sortie, et les filtres INCLUDE/EXCLUDE éventuels.Il permet ainsi de définir des filtres au niveau de chaque fichier en sortie.
Le paramètre OUTFIL est optionnel. Si absent, 'standard output' (stdout) est utilisé pour le fichier en sortie (les redirections et pipe UNIX sont permises).
Note: le fichier en sortie peut être le même que l'un des fichiers en entrée mais sur une opération SORT uniquement.
Forme 1 : le fichier en sortie indiqué "en dur" dans le fichier paramêtre
OUTFIL filename[,INCLUDE/EXCLUDE=(condition1,[AND/OR,condition2...)]
[,RECFM=recfm][,LRECL=lrecl][,DISP=disp]
filename : nom du fichier en sortie
condition : pos,long,datatype,operateur,pattern
pos : colonne de début de la zone à comparer
long : longueur de la zone à comparer
type : 'CH' (Char) ou 'BI' (Binary)
operateur : EQ ou NE ou LT ou LE ou GT ou GE
pattern : C'cccc' où cccc = chaîne de caractère à comparer
X'xxxx' où xxxx = valeur hexadécimale à comparer
N'nnnn' où nnnn = valeur numérique à comparer (à partir de la v6.92)
La longueur de la valeur doit être égale à la longueur de la zone à comparer
recfm : format d'enregistrement en sortie, s'il doit est différent de celui en entrée :
RECFM=V ou RECFM=F
lrecl : longueur d'enregistrement en sortie, si différente de celle en entrée.
Pour RECFM=V (variable), tronque l'enregistrement si plus petit que LRECL en entrée
Pour RECFM=F, tronque si plus petit que LRECL en entrée
fait un padding si plus grand que LRECL en entrée
disp : "Disposition" en cas d'existence du fichier en sortie avant lancement du tri :
DISP=NEW : s'arrête si le fichier en sortie existe déjà
DISP=OVERWRITE : écrase le fichier en sortie s'il existe déjà (défaut)
DISP=APPEND : écrit en "Append" si le fichier en sortie existe déjà
Paramètre équivalent ligne de commande : --outfile=
Forme 2 : le fichier en sortie décrit par une variable d'environnement
OUTFIL DD:varname[,INCLUDE/EXCLUDE=(condition1,[AND/OR,condition2...)]
[,RECFM=recfm][,LRECL=lrecl][,DISP=disp]
varname : Variable d'environnement contenant le nom du fichier en sortie
Forme 3 : association FILE=nn / variable SORTOFnn
Déprécié, maintenu pour compatibilité IBM DF/SORT et versions XSM antérieures. Utiliser la forme DD:varname à la place.
OUTFIL FILE=nn[,INCLUDE/EXCLUDE=(condition1,[AND/OR,condition2...)]
[,RECFM=recfm][,LRECL=lrecl][,DISP=disp]
FILEnn représente la variable d'environnement SORTOFn où nn est un nombre supérieur à 0.
Exemple :
OUTFIL FILE=01,INCLUDE=(8,2,CH,EQ,75) ; variable SORTOF1 pour le département Paris
OUTFIL FILE=02,INCLUDE=(8,2,CH,EQ,14) ; variable SORTOF2 pour le département Calvados
OUTFIL FILE=971,INCLUDE=(7,3,CH,EQ,971) ; variable SORTOF971 pour le département Guadeloupe
...
Exemples :
OUTFIL D:\TMP\BIGF.OUT ; Windows full pathname style, pas de filtres
OUTFIL /home/hh/bigf.out ; UNIX full path name style, pas de filtres
OUTFIL DD:FOO ; utilisation de variable FOO, pas de filtres
OUTFIL DD:FOO2,EXCLUDE=(11,3,CH,EQ,C'POP') ; retire en sortie tous les enregistrements
; qui contiennent 'POP' en colonne 11
OUTFIL /data1/clients1.dat,EXCLUDE=(11,3,CH,EQ,C'POP') ; idem, mais fichier codé en dur
; au lieu de variable
OUTFIL DD:XYZ1,INCLUDE=(11,3,CH,EQ,C'MAR',
OR,
11,3,CH,EQ,'GAS') ; ne sort que les enregistrements qui
; contiennent 'MAR' ou 'GAS' en colonne 11
Note : Ne pas insérer de commentaires à l'intérieur d'une clause conditionelle !
Cf. exemple de job avec COPY et sorties sélectives DD:...,INCLUDE=(...)
Les paramètres INCLUDE/EXCLUDE/OMIT
INCLUDE décrit les conditions pour conserver des enregistements.
EXCLUDE ou OMIT décrivent des conditions pour éliminer des enregistrements.
Forme 1 : Dédoublonnage, 1 ou plusieurs fichiers en sortie
NONE ; ne supprime rien (par défaut, pour compatibilité IBM DF/SORT)
DUPLICATE KEYS ; supprime toutes les lignes ou enregistrements avec la clé de tri
ou DUPKEYS ; en double ; équivalent du SUM FIELDS=NONE de DFSORT.
OMIT ou DUPKEY
DUPLICATE RECORDS ; supprime toutes les lignes ou enregistrements en double
ou DUPRECORDS
ou DUPRECORD
ou DUPRECS
ou DUPREC
Paramètre équivalent ligne de commande : --unique-key / --unique-record
Il est possible d'écrire tous les doublons (sur clé ou enregistrement) dans un fichier séparé,
avec le paramètre OUTFILDUP, et l'option WRITEFIRSTDUPLICATE.
Forme 2 : Filtrage conditionnel, 1 seul fichier en sortie
INCLUDE
EXCLUDE COND=(column,length,type,operator,pattern[,AND|OR,col,len,type,oper,pattern,...])
OMIT
col : début de zone à examiner dans chaque ligne (1..n)
len : longueur de la zone
type : CH (ignoré mais pour compatibilité IBM SORT...)
operateur : EQ ou NE ou LT ou LE ou GT ou GE
pattern : valeur de comparaison, de la forme C'ccccc...' où ccccc est une chaîne de caractères
X'xxxxx...' où xxxxx est une valeur hexadécimale
à partir de la v6.92 : N'nnnnn...' où nnnnn est une valeur numérique
à partir de la v6.93 : nnnnn... où nnnnn est une valeur numérique
Paramètre équivalent ligne de commande : --include= / --exclude=
Les ordres successifs (un par ligne) INCLUDE,EXCLUDE COND= sont traités avec un "ET" booléen.
INCLUDE COND=(1,5,CH,GT,N'100') INCLUDE COND=(1,5,CH,LT,N'500')est équivalent à :
INCLUDE COND=(1,5,CH,GT,100,AND,1,5,CH,LT,500)
Un ordre INCLUDE COND=() ou EXCLUDE COND=(...) ne fonctionne qu'avec un seul fichier en sortie.
Dès qu'il y a plusieurs fichiers en sortie, il faut appliquer la forme 3 :
Forme 3 : Filtrage sélectif, plusieurs fichiers en sortie
OUTFIL DD:variable,INCLUDE|EXCLUDE=(col,len,type,op,pattern[,AND|OR,col,len,type,op,pattern ...]) à partir de v6.92 : OUTFIL pathname,INCLUDE|EXCLUDE=(col,len,type,op,pattern[,AND|OR,col,len,type,op,pattern ...])
Les ordres EXCLUDE/INCLUDE sont compatibles avec VFIELDS à partir de la version 6.92.
EXCLUDE et OMIT sont synonymes.
Exemple 1 :
INCLUDE COND=(15,5,CH,EQ,C'JONES',OR,15,5,CH,EQ,C'SMITH') OMIT COND=(11,3,CH,EQ,C'000')
Ces deux ordres signifient :
- inclure les enregistrements dont le champs en col.15-19 contient 'SMITH' ou 'JONES'
- exclure de ces enregistrements ceux qui contiennent la valeur '000' en col. 11-13.
Exemple 2 :
SORT VFIELDS=(9,2,C,A,8,30,C,A,10,5,N,A),FIELDSEP=COMMA
RECORD RECFM=V,LRECL=400
; ---------------- Tous les clients:
OUTFIL DD:ALLCLIENTS
; ---------------- seulement les clients from New-York:
OUTFIL DD:NEWYORKERS,INCLUDE=(9,2,CH,EQ,C'NY')
; ---------------- Les autres clients en dehors de New-York:
OUTFIL D:\data\app1\others.csv,EXCLUDE=(9,2,CH,EQ,C'NY')
; ---------------- seulement les clients de Washingtown dont le nom commence par AB, CD, ou EF :
OUTFIL DD:WASHDC,INCLUDE=(9,2,CH,EQ,C'WA',AND,
(11,2,CH,EQ,C'AB',OR,
11,2,CH,EQ,C'CD',OR,
11,2,CH,EQ,C'EF'))
Ces trois ordres OUTFIL signifient :
- inclure tous les enregistrements dans le fichier défini par la variable d'environnement ALLCLIENTS
- inclure les enregistrements ayant le 9ème champ égal à "NY" dans le fichier défini par la variable d'environnement NEWYORKERS
- exclure ces enregistrements "NewYork" du fichier
D:\data\app1\others.csv - inclure les enregistrements ayant le 9ème champ égal à "NY" ET le 11ème champ commençant par "AB" ou "CD" ou "EF" dans le fichier défini par la variable d'environnement WASHDC
Voir des exemples de jobs XSM
Le paramètre OUTFILDUP
Le paramètre OUTFILDUP sert à indiquer un nom de fichier dans lequel seront écrits les doublons filtrés par OMIT DUPLICATE RECORDS ou OMIT DUPLICATE KEYSIl peut prendre 2 formes : nom de fichier ou variable :
OUTFILDUP /my/duplicate.file.txt
ou
OUTFILDUP DD:Myvariable
Paramètre équivalent ligne de commande : --outfiledup=
Par définition, seuls les enregistrements "doublons" sont écrits, mais pas l'enregistrement original qui a servi à comparer le(s) doublon(s).
Pour intégrér aussi ce premier enregistrement au fichier doublon, utiliser l'option WRITEFIRSTDUPLICATE ou l'option ligne de commande --outfiledup-record1
Le paramètre OUTREC
OUTREC sert à reformater un fichier en sortie. Il spécifie le dessin d'enregistrement en sortie.
Il ne peut y avoir qu'une seule instruction OUTREC.
S'il y a plusieurs fichiers en sortie, avec des filtres OUTFIL DD:xxx,INCLUDE=(...), alors le OUTREC s'appliquera à tous les fichiers en sortie.
le OUTREC traite l'enregistrement en sortie une fois trié et filtré ; donc le dessin d'enregistrement en sortie peut ne pas contenir les clés de tri.
Forme courte :
OUTREC FIELDS=(start,long[,start2,len2...])
start : position de départ
long : longueur
Paramètre équivalent ligne de commande : --outrec=
Forme longue :
OUTREC FIELDS=(start,long,type,offset[,start2,len2,type2,offset2...])
start : position de départ ou valeur de padding pour type=B, P, ou Z
long : longueur
type C : champ normal a copier
S : space : padding à blanc
B : byte : padding avec valeur de caractère indiquée en 'start'
P : Packed Decimal : padding avec valeur Packed Decimal indiquée en 'start'
Z : Zone Decimal : padding avec valeur Zoned Decimal indiquée en 'start'
offset : position en sortie
Padding :
Pour faire du padding avec un caractère donné, indiquez le type B
et indiquez le caractère de padding à la place du champ "start"
- soit sous forme de caractère,
- soit sous forme Hexadécimale,
- soit sous forme décimale.
Toutes les syntaxes suivantes sont équivalentes pour indiquer un padding en position 33 sur 10 avec le caractère 'A' :
Le début d'enregistrement, zone de 1 à 32, est automatiquement rempli avec des espaces ("blancs").
OUTREC FIELDS=(C'A',10,B,33)
OUTREC FIELDS=('A',10,B,33)
OUTREC FIELDS=(A,10,B,33)
OUTREC FIELDS=(X'45',10,B,33)
OUTREC FIELDS=(X45,10,B,33)
OUTREC FIELDS=(65,10,B,33)
OUTREC FIELDS=(D65,10,B,33)
OUTREC FIELDS=(D'65',10,B,33)
OUTREC FIELDS=(N65,10,B,33)
OUTREC FIELDS=(N'65',10,B,33)
Si le champ en entrée est plus long que la zone indiquée en sortie, alors le champs est tronqué
S'il s'agit de VFIELDS (champs à longueur variable avec séparateur), alors l'offset indique le rang en sortie.
Si nécessaire, l'enregistrement aura un padding avec le FIELDSEP défini
OUTREC FIELDS=(1,5,C,1,
2,5,C,12)
repositionne en sortie le 2ème champ en 12ème position :
Fichier en entrée :John;Smith;;123;Fichier en sortie :
John;;;;;;;;;;;;Smith;
Troncation :
Pour tronquer un enregistement, soit en RECFM=F ou RECFM=V, rajouter LRECL= + longueur voulue au paramètre OUTFIL.
Chaque définition de fichier en sortie OUTFIL peut avoir son propre LRECLRECORD RECFM=V,LRECL=300 ; input file specification ... OUTFIL DD:OUTNORMAL ; this file will use the input LRECL=300 OUTFIL DD:OUT_L40,LRECL=40 ; this file will have max 40 char record length OUTFIL DD:OUT_L100,LRECL=100 ; this file will have max 100 char record length
Exemples de reformatage
SORT FIELDS=(10,12,C,A) ; sort keys on pos 10, length 12, Character, Ascending RECORD RECFM=V,LRECL=200 ; input is variable length records ended with LR or CR/LF INPFIL /usr/include/stdint.h ; input file IOERROR IGNORE ; get rid of empty lines OUTFIL DD:SORTOUT,INCLUDE=(3,6,C,EQ,C'define') ; filters only ""# define ..." lines OUTREC FIELDS=(10,12,C,20) ; puts zone 10 to 21 at position 20Fichier en entrée : /usr/include/stdint.h
/* Limits of integral types. */ /* Minimum of signed integral types. */ # define INT8_MIN (-128) # define INT16_MIN (-32767-1) # define INT32_MIN (-2147483647-1) # define INT64_MIN (-__INT64_C(9223372036854775807)-1) ...Fichier en sortie :
INTMAX_MAX
INTMAX_MIN
INT_FAST64_M
INT_FAST64_M
INT_FAST8_MA
INT_FAST8_MI
INT_LEAST16_
INT_LEAST16_
...
Maintenant, rajoute un padding à '-' sur longueur 10, en position 1 :
OUTREC FIELDS=('-',10,B,1,
10,12,C,20)
Fichier en sortie:
---------- INTMAX_MAX ---------- INTMAX_MIN ---------- INT_FAST64_M ---------- INT_FAST64_M ---------- INT_FAST8_MA ---------- INT_FAST8_MI ---------- INT_LEAST16_ ---------- INT_LEAST16_ ...Maintenant, rajoute un Line Feed (1 byte, longueur 1) en position 23 :
OUTREC FIELDS=('-',10,B,1,
10,12,C,20,
X'0A',1,B,23)
Fichier en sortie:
---------- INT MAX_MAX ---------- INT MAX_MIN ---------- INT _FAST64_M ---------- INT _FAST64_M ---------- INT _FAST8_MA ---------- INT _FAST8_MI ---------- INT _LEAST16_ ---------- INT _LEAST16_ ...
Le paramètre SKIP_HEADER[S]
SKIP_HEADER nnn
SKIP_HEADERS nnn
Paramètre équivalent ligne de commande : --skip-header= --skip-headers=
Le paramètre SKIP_HEADER va ignorer les nnn premiers enregistrements (lignes) du premier fichier en entrée.
Le paramètre SKIP_HEADERS va ignorer les nnn premiers enregistrements (lignes) de chaque fichier en entrée.
Si un filtre EXCLUDE/INCLUDE est utilisé, le filtre s'applique aux enregistrements restant après suppression des nnn 1ers enregistrements par SKIP_HEADER.
SKIP_HEADER et SKIP_HEADERS sont mutuellement exclusifs.
Exemple :SKIP_HEADER 4 # throw away report header
Voir un exemple de jobs XSM avec SKIP_HEADER
Le paramètre OPTION
OPTION option1,option2,...
ou
OPTIONS option1,option2,...
où les options sont :
Cette option n'a de sens que pour les champs de 2 caractère de type 'Y' ou 'Y2K';
(Voir ci-dessous le paramètre 'FIELDS')
ou
COLLATE=EBCDIC
Elle garde l'ordre lexicographique EBCDIC pour les clés de tri ASCCI, à savoir :
- d'abord les minuscules,
- puis les majuscules,
- et enfin les chiffres.
ou
RSEP=hex_string
Cette option est principalement utilisée par les systèmes OPEN MVS et OS/400 pour les fichiers à longueur variables.
Elle définie le caractère (1 octet) délimitant les enregistrements.
Par défaut:
RSEP=0D0A (Windows)
RSEP=X15 (Open MVS)
RSEP=X25 (OS/400)
OPTION RSEP=| ou OPTION RSEP=7CParamètre équivalent ligne de commande : --record-separator=
ou
PROCESSORS=n
ou
PROCS=n
Par exemple, si vous avez une machine moderne 8-CPU, vous pouvez inclure cette option dans les parmfiles, afin d'augmenter les performances :
OPTION PROCS=8
En général, laisser XSM décider seul de l'usage optimal des ressources.
Paramètre équivalent ligne de commande : --procs=ou
KEEPORDER=Y|N
ou
EQUALS
Cf. explications sur le tri stable ci-dessous. Paramètre équivalent ligne de commande : --keep-order
Cette option permet de copier partiellement ou complètement le fichier en entrée dans un ou plusieurs fichiers en sortie.
Les parametres COPY suivants sont équivalents, pour compatibilité IBM DF/SORT :
OPTION COPY
ou
SORT FIELDS=COPY
ou
COPY
Paramètre équivalent ligne de commande : --copy
L'option COPY peut être suivie d'un ou plusieurs paramètres OUTFIL :
OUTFIL DD:variable ; équivalent à OUTFIL DD:variable,INCLUDE=ALL ou OUTFIL DD:variable,INCLUDE|EXCLUDE=(condition1[,AND/OR,condition2...])Cf. le paramètre 'OUTFIL' ci-dessous. Cf. exemple de job avec COPY et sorties sélectives DD:...,INCLUDE=(...)
ou
WRITEFIRSTDUP
Avec cette option "Write First Duplicate", ce premier enregistrement est également écrit dans le fichier doublons.
OMIT DUPKEYS
# Fichier en sortie, dédoublonné :
OUTFIL myoutput.txt
# fichier des doublons :
OUTFILDUP mesdoublons.txt
# force a écrire également le premier enregistrement qui va rencontrer un doublon
OPTION WRITEFIRSTDUPLICATE
Paramètre équivalent ligne de commande : --outfiledup-record1 ou --dup-rec1
soit le fichier suivant en entrée, trié sur nom, prénom :
01234001 JOHN PALMER 05678001 BOB JOHNSON 01234002 JOHN PALMER 05678002 BOB JOHNSON 06095300 KAREN SMITHRésultat du fichier doublons (OUTFILDUP mesdoublons.txt) sans l'option WRITEFIRSTDUPLICATE :
01234002 JOHN PALMER 05678002 BOB JOHNSONRésultat du fichier doublons (OUTFILDUP mesdoublons.txt) avec l'option WRITEFIRSTDUPLICATE :
05678001 BOB JOHNSON 05678002 BOB JOHNSON 01234001 JOHN PALMER 01234002 JOHN PALMER

English

Concurrent I/O on same disk: BAD!
Il y a une démo de ce job ! 