![]() |
XSM : eXtended Sort/Merge utility
by Henri Henault |
|
|
Documentation Utilisateur XSM
Note: ce qui suit s'applique à la dernière version ; 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. Sommaire
1. Introduction à XSMXSM 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'usager, 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 :
Nous l'appelons "parmfile". Il est décrit ci-dessous à la section Paramètres. 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. Il est recommandé d'utiliser le parmfile associé à la ligne de commande :
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".
2. Installation de XSML'installation du programme XSM est simple et prend 5 minutes.
XSM consiste en un programme exécutable Aucun pré-requis Matériel/Logiciel n'est nécessaire à XSM pour fonctionner sur votre Système d'Exploitation. Consultez simplement le guide d'installation UNIX/Linux ou Windows. Une fois le programme exécutable XSM activé, vous pouvez le renommer / le déplacer comme bon vous semble sur votre système.
Notez que l'exécutable XSM se nomme Tips :
Un programme exécutable XSM est lié au Système d'Exploitation sur lequel il a été activé. Ainsi, si vous copiez l'exécutable sur un autre système semblable, il est nécessaire d'activer XSM sur le système cible.
3. Lancement de XSMLe lancement de XSM est très simple :
2) A l'invite (Terminal UNIX ou fenêtre invite Windows cmd.exe) du système, entrer : hxsm votre-parmfile 3) Option -v 'Verbose': hxsm -v votre-parmfile 4) Option -c 'Check' : hxsm -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.
4. ParamètresXSM 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 :
paramètre OPTION - optionnel
paramètre SORT/MERGE - obligatoire si pas d'OPTION COPY
paramètre RECORD - obligatoire
paramètre INPFIL - optionnel
paramètre OUTFIL - optionnel
paramètre SORTWORKS - optionnel
paramètre IOERROR - optionnel
paramètre STORAGE - optionnel
paramètre INCLUDE - optionnel
paramètre EXCLUDE|OMIT - 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 :
# 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 vides sont permises n'importe où.
Le paramètre OPTION OPTION option,option,...
ou
OPTIONS option,option,...
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')
COLLATING=EBCDIC Elle garde l'ordre lexicographique EBCDIC pour les clés de tri ASCCI, à savoir :
RECORD_SEPARATOR=hex_string Elle définie les caractères ou paires de caractères délimitant les enregistrements. Par défaut: RSEP=0D0A (Windows) RSEP=X15 (Open MVS) RSEP=X25 (OS/400)
MULTI=n Par exemple, si vous avez une machine moderne 8-processeurs, vous pouvez inclure cette option dans les parmfiles, afin d'augmenter les performances : OPTION PROCS=8 Cf. explications ci-dessous.
Cette option permet de copier partiellement ou complètement le fichier en entrée dans un ou plusieurs fichiers en sortie. OUTFIL FILE=n,INCLUDE=(condition1[,AND/OR,condition2...]) ou OUTFIL FILE=n,INCLUDE=ALLCf. le paramètre 'OUTFIL' ci-dessous. Exemple d'utilisation du paramètre OPTION: OPTION PROCS=4,KEEP_ORDER ; force multithreading on 4 procs, force stable sort
Le paramètre SORT/MERGE
SORT ou MERGE FIELDS=(start,len,type,direction[,start,len,type,direction,..])
ou
FIELDS=(start,len,direction[,start,len,direction,..]),FORMAT=type
ou
FIELDS=ALL
ou
VFIELDS=(start,len,type,dir.[,start,len,type,dir.,..]),FIELDSEP=car
start : position de début d'une clé de tri ( 1 .. n ) ( pour FIELDS= )
: rang de la clé de tri ( 1 .. n ) ( pour VFIELDS= )
len : 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)
(contiendrait '84' pour l'année 1984)
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.
FIELDSEP : Le 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
On utilise le verbe SORT pour un ou plusieurs fichiers en entrée.
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 et 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é.
# Ces 3 paramètres SORT sont équivalents :
SORT FIELDS=(17,3,B,D,1,15,B,A)
or
SORT FIELDS=(17,3,BI,D,1,15,BI,A)
or
SORT FIELDS=(17,3,D,1,15,A),FORMAT=BI
Ils signifient :
Tips : Sur machines LITTLE-ENDIAN ("x86"), pour trier des entiers binaires (short int, long int), inverser simplement la direction: SORT FIELDS=(2,4,B,A) ; trie un long (32 bits) en ordre Descendant SORT FIELDS=(6,2,B,D) ; trie un short (16 bits) en ordre Ascendant Tri d'un fichier texte sur un nom en col. 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 ':'
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
or
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
Le paramètre RECORD
RECORD RECFM=record_format,LRECL=record_length
record_format : F (Fixed), V (Variable), M ("MFCOBOL" or "MFVariable")
V et T sont synonymes (équivalents)
record_length : longueur exacte d'enregistrement pour RECFM=F, y compris un
séparateur CR/LF
longueur max. d'enregistrement pour RECFM=V, sans compter le
séparateur de ligne CR/LF
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 incrémenté de 2 pour inclure CR/LF (fichiers plats Windows/UNIX)
RECFM=M est utilisé pour le format variable spécial MicroFocus COBOL sous le nom "MFCOBOL" ou "MFVariable"
RECORD RECFM=F,LRECL=400 signifie que tous les enregistrements sont de même taille (400 octets, y compris les CR/LF éventuels) 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);
Le paramètre INPFIL
Forme 1:
INPFIL filename
filename : nom du fichier en entrée
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.
A partir des versions 4.50/5.10, les fichiers peuvent être spécifiés "à la MVS" par un DDname : Exemples : 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.
Le paramètre OUTFILLe paramètre OUTFIL indique le nom des fichiers 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 écraser l'un des fichiers en entrée mais sur une opération SORT uniquement.
Forme 1 :
OUTFIL filename
filename : nom du fichier en sortie
Forme 2 :
OUTFIL DD:varname
varname : Variable d'environnement contenant le nom du fichier en sortie
Forme 3 :
OUTFIL FILE=n,INCLUDE/EXCLUDE=(condition1,[AND/OR,condition2...)
n : numéro de la variable d'environnement SORTOFn contenant le
nom du fichier en sortie
condition : start,length,datatype,operator,value
start : colonne de début de la zone à comparer
length : longueur de la zone à comparer
type : 'CH' (Char) ou 'BI' (Binary)
operator : EQ ou NE ou LT ou LE ou GT ou GE
value : C'xxxx' où xxxx = chaîne de caractère à comparer
La longueur de xxxx doit être égale à la longueur de la
zone à comparer
Exemples: OUTFIL D:\TMP\BIGF.OUT ; OS2, WIN32 full pathname style OUTFIL /home/hh/bigf.out ; UNIX full path name style OUTFIL DD:FOO ; nom du fichier en sortie via la variable d'environnement FOO OUTFIL FILE=1,INCLUDE=(11,3,CH,EQ,C'MAR',OR,11,3,CH,EQ,'GAS') ; nom du fichier en sortie via la variable SORTOF1 OUTFIL FILE=2,OMIT=(11,3,CH,EQ,C'POP') ; nom du fichier en sortie via la variable SORTOF2
Le paramètre SORTWORKS
SORTWORKS directory[,directory,...]
directory : liste des répertoires de manoeuvre
Le Paramètre SORTWORKS indique quel(s) répertoire(s) de manoeuvre utiliser pour les fichier temporaires. Exemples: SORTWORKS C:\TMP,D:\TEMP (OS2, WIN32) SORTWORKS /var/tmp,/tmp (UNIX) Le Paramètre SORTWORKS est optionnel. Par défaut, le répertoire courant est utilisé. *** l'utilisation de SORTWORKS est essentielle pour les performances *** Lorsque plusieurs sortworks sont spécifiés, XSM force le traitement multi-threading : un thread par répertoire.
Lorsque les deux paramètres Utiliser des sortworks sur un disque physique autre que celui contenant les fichiers en entrée et en sortie va augmenter de façon notoire les performances XSM en réduisant les contentions d'I/O concurrentes sur un même disque. En effet, pour simplifier, considérons que les phases XSM d'I/O sont : Phase 1 : lecture fichier input + écriture sortworks Phase 2 : lecture sortworks + écriture fichier outputLa combinaison input + output sur un même disque, sortworks sur un autre disque va produire les meilleurs résultats :
(Disk1) (Disk2)
Phase 1 : lecture fichier input Read
+ écriture sortworks Write
Phase 2 : lecture sortworks Read
+ écriture fichier output Write
La combinaison input + sortworks sur un même disque, output sur un autre disque va produire de mauvais résultats :
(Disk1) (Disk2)
Phase 1 : lecture fichier input Read
+ écriture sortworks Write <==
Illustration de la même opération, l'une avec 1 seul disque, l'autre avec 2 disques:
Les fichiers temporaires sont nommés d'après le Process Id XSM, par exemple Les fichiers temporaires sont supprimés en fin de job. En cas d'erreur sévère, il se peut qu'ils ne soient pas supprimés. Aussi il est conseillé de contrôler le code retour XSM.
Le paramètre IOERRORIOERROR IGNORE
Le paramètre IOERROR n'a de sens que pour les fichiers de texte (RECFM=V). Il indique à XSM que faire lorsqu'une ligne est plus courte que les clés définies:
Le paramètre STORAGE
STORAGE size{K|M|G}
size : quantité de mémoire centrale à utiliser, en KiloOctets,
MegaOctets, ou GigaOctets.
Exemples:
STORAGE 450K
STORAGE 2150K
STORAGE 8M
Le paramètre STORAGE est optionnel : par défaut, il est calculé automatiquement par XSM, en fonction du Système d'Exploitation et des fichiers à traiter. Pour les très gros fichiers, il permet dans certains cas de limiter la pagination, et éviter le System Stress qui en découle :
T = taille totale input en MegaOctets
T ≤ 64517 MB : STORAGE = Racine Carrée( T ) / 4
T > 64517 MB : STORAGE = T / 1020
Par exemple, 3 fichiers en entrée de 25000 MB
T = 3 x 25000 = 75000 (MB)
Dans ce cas, le paramètre STORAGE 74MB peut améliorer les performances.
Les paramètres INCLUDE/EXCLUDE/OMITForme 1 : Dédoublonnage
NONE ; ne supprime rien.
(par défaut)
OMIT DUPKEYS (or DUPLICATE KEYS) ; supprime toutes les lignes ou
enregistrements avec la clé de tri
en double
DUPRECORDS (or DUPLICATE RECORDS) ; supprime toutes les lignes ou
enregistrements en double
Forme 2 : Filtrage
INCLUDE
EXCLUDE COND=(col,len,pattern[,startcol,len,pattern ... ])
OMIT COND=(col,len,type,op,pattern[,AND|OR,col,len,type,op,pattern ...])
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
valeur : valeur de comparaison, de la forme C'aaaaa...' ou X'hhhhhhhh...'
Les ordres EXCLUDE/INCLUDE ne sont pas compatibles avec VFIELDS. EXCLUDE et OMIT sont synonymes. Les métacaractères '*' et '+' doivent être précédés d"un escape '\' : '\*' signifie 'toute chaîne de caractères','\+' signifie 'tout caractere',alors que '*' et '+' (not escaped) sont des caractères normaux.
Si le pattern ne contient pas le métacaractère '\*', alors sa longueur doit être égale à la longueur du champ, sinon le pattern sera tronqué ou paddé à blanc. Les triplets <start,len,pattern> successifs dans un même INCLUDE/EXCLUDE COND= sont traités avec un "OU" booléen Les ordres successifs INCLUDE/EXCLUDE COND= (un par ligne) sont traités avec un "ET" booléen. Exemple: 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 :
Le paramètre SKIP_HEADERSKIP_HEADER nnn Le paramètre SKIP_HEADER va ignorer les nnn premiers enregistrements (lignes) du fichier en entrée. Si plusieurs fichiers sont spécifiés, l'opération s'applique sur le premier fichier. Exemple: SKIP_HEADER 4 # throw away report header
5. Syntaxe ligne de commandeLe programme de Tri/Fusion XSM se lance depuis une ligne de commande. XSM peut être appelé avec ou sans fichier paramètres. Une fois les paramètres et options mises au point, intégrez la ligne de commande dans vos programmes batchs : Shell UNIX, .bat Windows ou toute autre langage procédural de votre choix. La syntaxe complète est :
hxsm [options]
Options:
-c, --check Option de vérification. Ne fait que vérifier le résultat d'une
opération de tri/fusion antérieure et affiche le message :
"XSM064I The file xxx correctly sorted" en cas de succes.
-q, --quiet Mode silencieux : aucune information sur stderr sauf si une erreur
se produit.
Noter que stdout est réservé pour la sortie par défaut si aucun fichier
en sortie n'est spécifié.
-v, --verbose Affiche les détails durant le traitement.
-v/--verbose et -q/--quiet sont mutuellement exclusifs.
-h, --help Affiche le mode d'emploi et s'arrête.
--sort Opération "tri" (par défaut).
Equivalent au paramètre SORT dans un fichier paramètres.
-m, --merge Opération "fusion".
Equivalent au paramètre MERGE dans un fichier paramètres.
--copy Opération "copie".
Equivalent au paramètre OPTION COPY dans un fichier paramètres.
--sort --merge --copy sont mutuellement exclusifs
-k, --key=start,len[,direction,[type] ]
définition des clés de tri :
start : position début (commence à 1) de la clé
length : longueur de la clé, en octets
direction : 'D' = descendant, 'A' = ascendant
type : 'C' = caractère
'B' = octet binaire ("low value" en Cobol)
'I' = ignore casse Majuscule/minuscule
'N' = numérique
'P' = champ Décimal Packé
(seulement pour fichiers en RECFM=F ou M)
'Y' = année d'une date
Equivalent à la partie FIELDS= du paramètre SORT dans un
fichier paramètres
-k all, --key=all Tri avec clé = l'enregistrement entier
Equivalent à la partie FIELDS=ALL du paramètre SORT dans un
fichier paramètres
-r, --recfm=F|V|M Indique le format d'enregistrement (RECord ForMat) :
F (Fixed), V (variable), M (MFCobol)
Par défaut : V (variable)
Equivalent à la partie RECFM= du paramètre RECORD dans un
fichier paramètres
-l nnn, --lrecl=nnn Indique la longueur logique d'enregistrement (Logical ReCord Length):
nnn = longueur exacte d'enregistrement pour RECFM=F, y compris un
séparateur CR/LF
nnn = longueur max. d'enregistrement pour RECFM=V, sans compter
le séparateur de ligne CR/LF
Equivalent à la partie LRECL= du paramètre RECORD dans un
fichier paramètres
-z nnn Identique à -l nnnn (pour compatibilité sort UNIX)
--infile=filein[,recfm=F|V|M[,lrecl=nnn] Spécifie le(s) fichier(s) en entrée
RECFM et LRECL peuvent être spécifiés avec un fichier en entrée lors
d'un reformatage.
Cf. Reformatage
Plusieurs fichiers en entrée peuvent être spécifiés ainsi :
--infile=/tmp/f1 --infile=/tmp/f2 ...
Equivalent au paramètre INPFIL dans un fichier paramètres
-o, --outfile=fileout[,recfm=F|V|M[,lrecl=nnn]] Spécifie le fichier en sortie
RECFM et LRECL peuvent être spécifiés avec un fichier en sortie lors
d'un reformatage.
Cf. Reformatage
--outrec=(in_pos1,len1,out_pos1,type1[,in_pos2,...])
Spécifie le dessin d'enregistrement en sortie lors d'un reformatage.
Cf. Reformatage
-uk, --unique-key Supprime les prochains enregistrements avec clés doublons, le 1er est
conservé
Equivalent au paramètre OMIT DUPLICATE KEYS dans un fichier
paramètres
-ur, --unique-record Supprime les prochains enregistrements doublons, le 1er est conservé
Equivalent au paramètre OMIT DUPLICATE RECORDS dans un fichier
paramètres
--include=start,len,op,val[AND|OR,start,len,op,val...]
Spécifie un filtre "inclure"
Equivalent au paramètre INCLUDE dans un fichier paramètres
--exclude=start,len,op,val[AND|OR,start,len,op,val...]
Spécifie un filtre "exclure"
Equivalent au paramètre EXCLUDE dans un fichier paramètres
-t dir1,dir2 --sortwork[s]=dir1,dir2,...
Spécifie la liste de répertoires de manoeuvre
On peut spécifier une liste de répertoires séparés par une virgule (,)
ou plusieurs options --sortworks= ou -t :
--sortworks=/tmp1/dir1 --sortworks=/tmp/dir2
équivalent à :
--sortworks=/tmp1/dir1,/tmp/dir2
équivalent à :
-t /tmp1/dir1 -t /tmp/dir2
équivalent à :
-t /tmp1/dir1,/tmp/dir2
Equivalent au paramètre SORTWORKS dans un fichier paramètres
-y nnnK|M|G, --storage=nnnK|M/G Force l'allocation en mémoire centrale à nnn Kilo/Méga/GigaOctets
Dans la plupart des cas, il est recommandé de laisser XSM faire
lui-même le calcul
A n'utiliser que lors de traitements lents sur des gros fichiers
Equivalent au paramètre STORAGE dans un fichier paramètres
--keep-order Force le mode de tri non-destructif, également nommé "stable sort"
Cf. explications ci-dessous
Equivalent au paramètre OPTION KEEP_ORDER dans un fichier paramètres
--record-separator=C|0xhh Définie les caractères ou paires de caractères séparateurs
d'enregistrements
Principalement utilisé pour les fichiers variables sous OPEN MVS et
OS/400
Equivalent au paramètre OPTION RECORD_SEPARATOR dans un fichier paramètres
--collating-sequence=ebcdic force la séquence alphanumérique à IBM EBCDIC
Equivalent au paramètre OPTION COLLATING dans un fichier paramètres
--skip-head=nnn Ignore les nnn premiers enregistrement en entrée
Equivalent au paramètre SKIP_HEADER dans un fichier paramètres
--throw-empty-records Ignore les enregistrements vides. Sans cette option, XSM s'arrête
en erreur lorsqu'il rencontre un enregistrement vide (taille=0) en entrée.
-i Ignore les lignes de longueur plus courtes que les clés de tri
(fichiers texte RECFM=V seulement)
Equivalent au paramètre IOERROR IGNORE dans un fichier paramètres
-n n, --procs=n Force le multi-threading à n Threads
Equivalent au paramètre OPTION PROCS dans un fichier paramètres
--norun Teste la syntaxe d'un fichier paramètres, sans exécuter le traitement
Options courtes et longues peuvent être combinées dans la commande, comme suit: hxsm --input-file=/tmp/f.in -o/tmp/f.out myparms.xms Pour un démarrage facile, consultez les exemples de tris dans le chapitre suivant "Exemples de tris" :
6. Exemples de tris : La meilleure façon de commencer !Job 1. Un fichier texte
Job 2. Un fichier texte, redirection du flux stdout
# Job 2 : OUTFIL n'est pas spécifié : XSM écrira sur 'stdout' # Utilisé pour rediriger la sortie directement à un programme SORT FIELDS=(14,7,B,A) RECORD RECFM=V,LRECL=200 INPFIL SAMPLE.INPLigne de commande : hxsm job2.xsm | myreportLigne de commande complète sans fichier paramètres: hxsm -k 14,7 SAMPLE.INP | myreport Pour supprimer les enregistrements doublons ("dédoublonner"), ajouter l'option -ur (ou --unique-record) : hxsm -ur -k 14,7 SAMPLE.INP | myreport
Job 3. Un fichier texte, redirection des flux stdin,stdout
# Job 3 : ni INPFIL ni OUTFIL ne sont spécifiés : # Les redirections au style UNIX sont utilisées à la place SORT FIELDS=(14,7,B,A) RECORD RECFM=V,LRECL=200Ligne de commande : account | hxsm job3.xsm | myreportLigne de commande complète sans fichier paramètres: account | hxsm -k 14,7 | myreport
Job 4. Deux fichiers binaires, UNIX, deux unités disque
SORT FIELDS=(14,20,B,A,2,6,B,D) RECORD RECFM=F,LRECL=180 INPFIL ../s1 ; fichier input #1 INPFIL ../s2 ; fichier input #2 OUTFIL /usr/acct/sample.out ; fichier output SORTWORKS /var/tmp,/tmp ; 2 disques de manoeuvre STORAGE 4M ; Storage 4M pour minimiser les I/O sortworksLigne de commande : hxsm job4.xsmLigne de commande complète sans fichier paramètres: hxsm -y 4200K -k 14,20 -k 2,6,d -r F -z 180 \
-t /var/tmp,/tmp \
-o /usr/acct/sample.out ../s1 ../s2
Job 5. Deux fichiers binaires, UNIX, deux unités disques
Fichier paramètres job5.xsm: SORT FIELDS=(14,20,B,A,2,6,B,D) RECORD RECFM=F,LRECL=180 INPFIL ../s1 INPFIL ../s2 OUTFIL /usr/acct/sample.out SORTWORKS /var/tmp,/tmp OMIT 1,1,* ; Note: ; 1,1,* signifie : pos 1, long 1, valeur: caractère astérisque '*' ; ==> donne les résultats attendus :) ; 1,1,\* signifierait : pos 1, long 1, valeur: n'importe quel caractère ; ==> donnerait des résultats étranges :(Ligne de commande : hxsm job5.xsm Pas de ligne de commande complète, à cause du paramètre OMIT
Job 6. Un fichier texte type CSV à champs variables
Fichier paramètres job6.xsm: SORT VFIELDS=(3,40,I,A,2,10,N,D),FIELDSEP=SEMICOLUMN RECORD RECFM=T,LRECL=100 INPFIL ../s1 OUTFIL /usr/acct/sample.out OMIT DUPKEYS ; raccourci de OMIT DUPLICATE KEYSLigne de commande : hxsm job6.xsm Pas de ligne de commande complète, à cause du VFIELD Variante : un fichier CSV, Windows
Fichier paramètres job6b.xsm: SORT VFIELDS=(3,40,C,A,2,10,N,D),FIELDSEP=SEMICOLUMN RECORD RECFM=T,LRECL=600 INPFIL C:\data\myfile.csv OUTFIL D:\data\myfile_sorted.csv Note : Pour les séparateurs type "ponctuation", l'utilisation de symboles SEMICOLUMN[, COMMA, etc..] est recommandée afin d'éviter toute erreur d'analyse du parmfile. Ligne de commande : hxsm job6b.xsm Pas de ligne de commande complète, à cause du VFIELD
Job 7. Un fichier binaire contenant des zones "Packed Decimal"
Fichier paramètres job7.xsm: SORT FIELDS=(1,4,P,D,21,20,B,A) RECORD RECFM=F,LRECL=110 INPFIL E:\tmp\s1.bin OUTFIL E:\tmp\s2.binLigne de commande : hxsm job7.xsm | myreport Ligne de commande complète sans fichier paramètres: hxsm -r F -l 110 -k 1,4,P,D -k 21,20 -o E:\tmp\s2.bin E:\tmp\s1.bin
Job 8. Un fichier texte avec des dates au format 'mmjjaa'
Fichier Paramètres job8.xsm: SORT FIELDS=(1,4,BI,A,21,20,BI,A,65,2,Y2K,D,63,2,BI,D,61,2,BI,D) RECORD RECFM=V,LRECL=110 INPFIL /tmp/s1.txt OUTFIL /tmp/s2.txtLigne de commande : hxsm job8.xsm | myreport Pas de ligne de commande complète, à cause du type Y2K Pour traiter des dates du 20eme siècle (19xx) mais antérieures à 1970, rajouter le paramètre :
OPTION Y2KSTART=19nn
Exemple:
OPTION Y2KSTART=1963 # changement du pivot 20e / 21e siècle de 1970 à 1963
64, 65, .... 99 seront considérées comme 19nn00, 01, ... 63 seront considérées comme 20nn Cf. FAQ, Y2K pour des explications sur le pivot Y2K.
Job 9. Un fichier texte avec élimination des doublons
Fichier Paramètres job9.xsm: SORT FIELDS=all RECORD RECFM=V,LRECL=52 ; sans compter les CR/LF INPFIL /tmp/s1.txt OUTFIL /tmp/s2.txt OMIT DUPRECS ; raccourci de OMIT DUPLICATE RECORDSLigne de commande : hxsm job9.xsm | myreport Ligne de commande complète sans fichier paramètres: hxsm -r V -l 52 -k all -ur -o /tmp/s2.txt /tmp/s1.txt
Job 10. Copie sélective d'un fichier avec éclatement sur plusieurs fichiers
DD:varname impose que la variable d'environnement varname soit initialisée avant l'appel de XSM.
La forme
Notez que l'usage de Fichier Paramètres job10.xsm: OPTION COPY RECORD RECFM=V,LRECL=152 ; excluding CR/LF INPFIL DD:SORTIN OUTFIL FILE=1,INCLUDE=ALL OUTFIL FILE=2,INCLUDE=(1,5,CH,EQ,'SCOTT',AND,16,5,CH,EQ,'TIGER') OUTFIL FILE=3,INCLUDE=(1,5,CH,NE,'SCOTT',OR,16,5,CH,NE,'TIGER') OMIT DUPRECSLigne de commande (UNIX) : SORTIN=/tmp/myappl/data_to_copy.text \ SORTOF1=/tmp/s1 \ SORTOF2=/tmp/s2 \ SORTOF3=/tmp/s3 \ hxsm job10.xsm Ligne de commande (Windows) : setlocal set SORTIN=/tmp/myappl/data_to_copy.text set SORTOF1=/tmp/s1 (or \tmp\s1 ...) set SORTOF2=/tmp/s2 set SORTOF3=/tmp/s3 hxsm job10.xsm
Pas de ligne de commande complète, à cause des formes
Job 11. Eclatement sélectif d'un fichier selon filtres
Fichier Paramètres job11.xsm: SORT FIELDS=(1,5,C,A,16,5,C,A) RECORD RECFM=V,LRECL=152 ; sans compter CR/LF INPFIL DD:SORTIN OUTFIL FILE=1,INCLUDE=ALL OUTFIL FILE=2,INCLUDE=(1,5,CH,EQ,'SCOTT',AND,16,5,CH,EQ,'TIGER') OUTFIL FILE=3,INCLUDE=(1,5,CH,NE,'SCOTT',OR,16,5,CH,NE,'TIGER') OMIT DUPRECSLigne de commande (UNIX) : SORTIN=/tmp/myappl/data_to_split.text \ SORTOF1=/tmp/s1 \ SORTOF2=/tmp/s2 \ SORTOF3=/tmp/s3 \ hxsm job11.xsm
Pas de ligne de commande complète, à cause des formes
Job 12. Fusion de fichiers et éclatement sélectif selon filtres
Fichier Paramètres job12.xsm: SORT FIELDS=(1,5,C,A,16,5,C,A) RECORD RECFM=V,LRECL=152 ; excluding CR/LF INPFIL DD:MYINPUT1 ; variable name is free with DD: form INPFIL DD:MYINPUT2 ; variable name is free with DD: form INPFIL DD:MYINPUT3 ; variable name is free with DD: form OUTFIL FILE=1,INCLUDE=ALL OUTFIL FILE=2,INCLUDE=(1,5,CH,EQ,'SCOTT',AND,16,5,CH,EQ,'TIGER') OUTFIL FILE=3,INCLUDE=(1,5,CH,NE,'SCOTT',OR,16,5,CH,NE,'TIGER') OMIT DUPRECSCommand lines (UNIX): MYINPUT1=/tmp/myappl/data1 \ MYINPUT2=/tmp/myappl/data1 \ MYINPUT3=/tmp/myappl/data1 \ SORTOF1=/tmp/s1 \ SORTOF2=/tmp/s2 \ SORTOF3=/tmp/s3 \ hxsm job12.xsm
Pas de ligne de commande complète, à cause des formes
7. Tri Destructif et non destructifsXSM fonctionne en mode destructif par défaut : il n'assure pas que l'ordre original des ensembles de lignes ou enregistrements ayant la(les) même(s) clé(s) de tri seront conservées. Les algorithmes de tris propres à chaque utilitaire de tri produiront des résultats différents et indéterminés, ceci pour des raisons de performances.
XSM devient un tri non-destructif (ou tri "stable") avec l'option :
OPTION KEEP_ORDER=YES (dans un fichier paramètres)or --keep-order (option de ligne de commande)
Exemple: fichier en entrée :
01234 SMITH John
01738 SMITH Robin
02284 ALLEN David
04264 ALLEN Bob
Résultat par défaut (destructif), avec clé de tri = Nom :
04264 ALLEN Bob
02284 ALLEN David
01234 SMITH John
01738 SMITH Robin
Résultat en mode Non-destructif (ou "stable") :
02284 ALLEN David
04264 ALLEN Bob
01234 SMITH John
01738 SMITH Robin
Note: Forcer le mode non-destructif peut dégrader les performances car l'enregistrement entier est traité, pas uniquement la clé de tri.
8. Conseils pour les performancesConsultez nos Relevés de Performance. Le programme XSM est un tri multiphases : s'il ne peut pas trier l'ensemble des fichiers en entrée en mémoire vive en une seule passe, il écrit sur disques, puis interclasse, des portions toutes triées appelées 'monotonies', puis les fusionne dans le fichier en sortie. Les performances sont liées :
Sinon, XSM constitue des monotonies qu'il écrit dans des fichiers de travail, puis les interclasse dans d'autres fichiers de travail, et ce jusqu'à l'interclassement final dans le fichier de sortie. Dans ce cas les performances sont essentiellement liées à la vitesse des unités de disques. Si de plus les clés de tri sont des champs de longueur variable (VFIELDS), les performances sont divisées par un facteur deux. Les enregistrements de longueur fixe sont lus et écrits par blocs volumineux, d'où gain important d'entrées/sorties. Si l'on utiliser des filtres 'INCLUDE/EXCLUDE/OMIT', les lectures sont unitaires, exactement comme pour le format variable. Bien que l'on puisse allouer jusqu'à 512 Meg., on sait qu'au delà d'une certaine limite, le Système d'exploitation passera la quasi-totalité du temps à paginer. A partir de la version 5, XSM calcule lui-même ses besoins en mémoire, en général :
Pour les très gros fichiers, ce calcul peut provoquer un forte pagination Vous pouvez donc dans ce cas utiliser le paramètre STORAGE pour limiter le phénomène. Exemple : tri d'un fichier de 50 GB sur une machine à 128 MB. Vous voulez réserver au moins 80MB pour votre Système d'exploitation :
XSM passera plus de temps dans les opérations de fusion, mais vous échapperez au tristement célèbre phénomène de 'System Stress'. Quelques remarques : UNIX : on peut toujours donner une bonne priorité à un travail (commande 'nice'), mais elle n'influe guère. Windows : amusez-vous avec la souris pendant un tri volumineux et le temps de tri est multiplié par 10 !!! Les bonnes pratiques :
Gardez à l'esprit que sur les machines actuelles, le goulot d'étranglement reste l'entrée/sortie sur disque physique : CPU et mémoire sont très rapides par rapport aux unités mécaniques tels que les disques.
Si possible, mettre les fichiers d'entrée et de sortie (ils peuvent ne faire qu'un) sur une unité, et les fichiers de manoeuvre sur une autre, comme expliqué à la section SORTWORKS. Assurez vous cependant que vous avez suffisamment de place sur chaque unité : au moins la taille du fichier en sortie sur la 1ere unité, et un au moins quart de cette taille sur l'autre. Sur un vrai Système multi-tâches (UNIX, OS/2, Win NT), il est possible que d'autres programmes (et le Système lui-même) utilisent telle ou telle unité : choisissez les disques les moins 'fréquentés'. Et pour terminer, ne confondons pas : et 'Deux unités physiques C: et D:' (même remarque pour les Filesystems UNIX).
9. Utilisation de la librairie de programmation XSM (User Exit)
Il y a deux façons d'utiliser XSM comme tri interne dans un programme, via la technique dite "User Exit" :
Sous Windows, les bibliothèques dynamique se nomment Exemple: Le module suivant est compilé, puis link-edité pour produire 'libmysrt.a' (AIX), ou 'libmysrt.so' (LINUX), ou 'MYSRT.DLL' (Windows):
#include <stdio.h>
int myread(char * xsm_buf, int xsm_maxl) {
/* this routine reads on stdin, and arrange the lines to be sorted */
/* the lines beginning with a '*' are to be dropped */
char mybuf[134];
do if (gets(mybuf) == NULL) return EOF;
while (mybuf[0] == '*');
/* set up the record to be sorted, return its length */
return sprintf(xsm_buf, "%-5.5s%-20.20s%s", mybuf+20, mybuf,mybuf+25);
}
int mywrite(char * xsm_buf, int xsm_len) {
/* this routine arrange the sorted lines and write them onto stdout */
if (xsm_len > 0)
printf("-20.20s%-5.5s%s\n", mybuf+5, mybuf, mybuf+25);
return 0;
}
Then the library is moved somewhere in the 'PATH' (Windows), or in the 'LD_LIBRARY_PATH' (UNIX) directories list; Finally, the hxsm module is run with the following fichier paramètres:
SORT FIELDS=(25,5,B,D,1,20,B,A)
RECORD RECFM=V,LRECL=132
INPXIT LIBRARY=mysrt,ENTRY=myread
OUTXIT LIBRARY=mysrt,ENTRY=mywrite
Exemple : Le programme C suivant demande, en itération, un nom et un montant, jusqu'à ce que l'utilisateur entre le signal EOF (^Z ou ^D), puis affiche les lignes saisies triées par montant descendant, puis affiche le total. Il est compilé, puis link-edité avec la bibliothèque hxsm.
#include <stdio.h>
double atof(), total = 0.0;
static int myread(char * buf, int maxlen) {
char work_area_1[133], work_area_2[133];
double amount;
/* prompt for a name and an amount, returns -1 if EOF */
printf("Name :" ); if (gets(work_area_1) == NULL) return -1;
printf("Amount :" ); if (gets(work_area_2) == NULL) return -1;
amount = atof(work_area_2);
return sprintf(buf, "%9.2f %-30.30s", amount, work_area_1);
}
static int mywrite(char * buf, int len) {
if (len > 0)
printf("%-30.30s %-12.12s\n", buf + 13, buf);
return len; /* will be ignored by hxsm */
}
main(int argc, char **argv) {
int rc = hxsm_begin("MYPRM.XSM", myread, mywrite);
if (rc == 0)
printf("%-30.30s %9.2f\n", "*** TOTAL ***", total);
else printf("Failed, rc %d\n", rc);
return rc;
}
Le programme utilise le fichier paramètre MYPRM.XSM suivant :
SORT FIELDS=(1,12,B,D) RECORD RECFM=V,LRECL=132On peut également coder les paramètres de lignes de commandes au lieu du nom de fichier paramètre :
int rc = hxsm_begin("-k1,12,d", myread, mywrite);
et lancer le programme sans utiliser de fichier paramètres.
Pour toute question, assistance, consultez nos FAQ ou contactez notre support. |
| Contact | Company Info | Site map | Trademarks | Design Stéphane HENAULT © HH&S 1994-2010 | ![]() |