DONNÉES DONT LE NOMBRE D'APPARITIONS PEUT VARIER

Il arrive souvent qu'une information soit une suite de caractères de longueur variable.

Par exemple, un numéro de mois peut compter un ou deux chiffres, un mot peut compter de une à plus de vingt-six lettres, une ligne peut compter de zéro à 132 caractères affichables, etc.


Il est possible d'indiquer un nombre variable de répétitions d'un patron de fouille. La syntaxe suivante doit être utilisée:

Borne inférieure~Borne supérieure

Dans les données en entrée, le patron répété devra se vérifier consécutivement au moins le nombre de fois indiqué par la borne inférieure

La borne supérieure indique le nombre maximum de fois que ce patron sera vérifié consécutivement sur ces données.

Par exemple: MOIS 1~2 '0: '9 indique qu'au moins un chiffre devra être présent en entrée et qu'au plus deux seront utilisés et assignés à la variable MOIS.


La transformation International pourrait maintenant s'écrire:

(1)/International :
(2)MOIS 1~2 d, '/', JOUR 1~2 d, '/',
(3)ANNEE 2~4 d
(4)= ANNEE,'-',MOIS,'-',JOUR.
(5)/d = '0':'9'

Qu'arrive-t-il si on applique cette transformation aux données suivantes?

12/30/1976 3/31/19851/9/67 1/2/3 912/1/80

On obtient alors:

1976-12-30 1985-3-3167-1-9 1/2/3 980-12-1

La date 12/30/1976 a d'abord été rencontrée: elle devient 1976-12-30, tout simplement.

La date 3/31/1985 est ensuite rencontrée. Remarquez bien que malgré la présence de 5 chiffresconsécutifs ( 19851 ), le patron ANNEE 2~4 d s'est vérifié: au moins 2 chiffres étaient présents et jusqu'à quatre d'entre eux ont été reconnus et assignés à la variable ANNEE.

Le cinquième chiffre a donc été reconnu par la suite comme premier chiffre du mois de la troisième date (1/9/67 ).

La séquence de caractères 1/2/3 n'a pas été reconnue comme une date puisque l'année ne comportait pas au moins deux chiffres.

La séquence de caractères 912 n'a pas été reconnue comme le début d'une date parce qu'une barre oblique n'est pas présente immédiatement après le second chiffre du mois (celui-ci en comptant trois). Le caractère 9 est donc retranscrit tel quel en sortie et la règle est à nouveau vérifiée: la séquence de caractères 12/1/80 est alors reconnue comme une date et est retranscrite sous la forme 80-12-1.


Lorsque 0 est utilisé comme borne inférieure pour le nombre d'apparitions possible d'un patron, les données correspondant à ce patron peuvent ne pas être présentes.


Par exemple, si dans la transformation dBase II le numéro de téléphone et le code postal étaient facultatifs, les patrons de fouille pourraient s'écrire:

NOM 24c, 6c,
0~1 ( '(', REGION 3d, ')', TELEPHONE 8c),
CODE_POSTAL 0~1 Code

Les patrons soulignés peuvent donc être absents (apparaître zéro fois) ou présents (apparaître une fois).

Les patrons de fouille affectés par un nombre d'apparitions peuvent être bien plus complexes qu'un simple ensemble de caractères puisqu'ils peuvent indiquer la répétition de toute une structure de données.

Un mot ou une ligne de texte n'ont pas vraiment une longueur maximale: la borne supérieure peut alors être omise, afin que tout ce qui peut correspondre au patron répété puisse être reconnu.

Les types de données suivants sont fréquemment utilisés:

/Mot = 1~ Lse vérifie pour un mot de une ou plusieurs lettres;
/Ligne = 0~ cse vérifie pour une ligne comptant aucun, un ou plusieurs caractères affichables;
/Argent= 0~ d,'.',2 dse vérifie pour une somme d'argent comportant aucun, un ou plusieurs chiffres et toujours 2 décimales.


La borne supérieure d'un intervalle de nombre d'apparitions d'un patron de fouille peut être omise: il n'y a alors pas de limite au nombre de fois que les données correspondant à ce patron pourront apparaître en entrée.



La borne inférieure d'un intervalle de nombre d'apparitions d'un patron de fouille peut être omise: les données correspondant à ce patron peuvent alors être absentes.


Des informations facultatives peuvent donc se noter ~1, et notre exemple précédent peut donc s'écrire:

NOM 24c, 6c,
~1 ( '('. REGION 3d. ')'. TELEPHONE 8c ),
CODE_POSTAL ~1 Code

Remarquez que les bornes inférieures et supérieures ne peuvent pas être toutes les deux omises en même temps: la présence facultative d'un nombre indé terminé d'informations se note 0~ et non pas ~.

D'autre part, il faut éviter de définir des règles dont aucun patron de fouille n'exige la présence d'au moins un item d'information (donc, dont tous les patrons sont de la forme) 0~ ou de la forme ~nombre : ce type de règle se vérifie toujours, même sur des données vides et peut donc s' appliquer indéfiniment: ADAPT peut alors sembler «figé» ou encore répéter sans cesse le même résultat.

MISE EN FORME DES RÉSULTATS : LES CONSTRUCTEURS

Lorsqu'une règle s'applique, le résultat produit en sortie n'est parfois qu'une simple chaîne de caractères constante, mais il doit souvent être construit par toutes sortes de moyens.


Un constructeur définit comment produire une suite de caractères: il la construit.

La suite de caractères, ainsi produite, pourra servir de résultat inscrit en sortie: le constructeur définit donc le résultat à produire.


Répétitions

Les résultats produits en sortie comportent souvent des répétitions: ADAPT vous permet donc d'indiquer un facteur de répétition dans un constructeur. Par exemple, 4 '*' produit quatre étoiles et 10 ' ' produit dix espaces.

ADAPT vous permet de définir une chaîne de caractères plus longue qu' une ligne. En effet, si plusieurs chaînes de caractères, toutes entre guillemets ou toutes entre apostrophes, se suivent mais ne sont pas séparées par des virgules, ADAPT considère cette séquence comme la définition d' une seule et même chaîne de caractères.

Cette particularité s'applique aux chaînes constantes mais pas aux variables et autres constructeurs.

'+' '-'équivaut donc à la définition '+-' .
2 '+' '-'construit la suite de caractères +-+- .
2 '+','-'construit la suite de caractères ++- .

Par contre :

2 '+' VAR construit la suite de caractères ++ complétée par le contenu de la variable VAR. Ceci équivaut donc à 2 '+',VAR

Regroupements

Une répétition peut s'appliquer sur plusieurs constructeurs: il suffit alors de placer entre parenthèses l'ensemble des constructeurs à répéter.

Par exemple:

3 ('<<<',NOM,'>>>') inscrit trois fois des chevrons et le contenu de la variable NOM:

<<<Jacques>>><<<Jacques>>><<<Jacques>>>

Vous pouvez aussi rapidement définir des entêtes de page:

2 (20 '*',' Relevé mensuel ', 20 '*', ^M^J)

produira:

******************** Relevé mensuel ********************
******************** Relevé mensuel ********************

ATTENTION:Lorsqu'un nom de variable (ou de constructeur, tel que nous le verrons plus loin) précède un regroupement entre parenthèses, une virgule de séparation doit toujours être inscrite entre ce nom de variable et la parenthèse ouvrante.

Cadrage à gauche et à droite

Il arrive souvent que des informations doivent être cadrées à gauche ou à droite dans un nombre fixe de colonnes.


Les opérateurs ^< et ^> suivis d'un nombre permettent de cadrer ce que produit un constructeur à gauche ou à droite dans le nombre de colonnes indiqué:

Lors d'un cadrage à gauche, si ce que produit le constructeur est plus court que le nombre de colonnes des espaces sont ajoutés immédiatement après pour compléter le nombre de colonnes requis.

Lors d'un cadrage à droite, si ce que produit le constructeur est plus court que le nombre de colonnes des espaces sont ajoutés avant pour compléter le nombre de colonnes requis.



Lorsque ce que produit le constructeur est plus grand que le nombre n de colonnes:


^<5 "abcdefg"
inscrit abcde en sortie.
^<24 NOM
inscrit le contenu de la variable NOM à gauche dans un champs de 24 colonnes. Si la variable NOM contient plus de 24 caractè res, les 24 premiers sont inscrits. Si la variable contient moins de 24 caractères, ceux-ci sont inscrits suivis de suffisamment d'espaces pour compléter les 24 colonnes.

^>8 "12"
inscrit 12 en sortie.
^>3 "12345"
inscrit 345 en sortie.
^>12 MONTANT
inscrit le contenu de la variable MONTANT à droite dans un champ de 12 colonnes. Si la variable MONTANT contient plus de 12 caractères, les 12 derniers sont inscrits. Si la variable contient moins de 12 caractères, des espaces sont d'abord inscrits, puis le contenu de la variable, pour un total de 12 colonnes.

Les opérateurs de cadrage sont aussi très utiles pour extraire des caractères à l'intérieur d'une chaîne.

Par exemple, un numéro d'assurance maladie du Québec contient l'année de naissance de l'assuré en colonne 5 et 6 (Ex.: 53 dans DUPA53052602 ).

^>2(^<6 ASS_MALADIE)
extrait cette année de naissance:

^<6
cadre le numéro d'assurance maladie à gauche dans un champs de 6 caractères: seules les colonnes 1 à 6 sont conservées ( DUPA53 ).
^>2
cadre ensuite ce qui reste à droite dans un champs de 2 caractères: les quatre premiers caractères sont donc perdus et seuls les deux derniers ( 53 ) sont conservés.

EXEMPLE COMPLET : Impression sur deux colonnes

Lorsqu'une longue liste de données est formée de lignes courtes (moins de 40 caractères), il est souvent intéressant de l'imprimer sur deux colonnes:

(1)/Deux_colonnes :
(2)GAUCHE 0~ c, ^M^J,
(3)DROITE 0~ c, ^M^J
(4)= ^<40 GAUCHE, DROITE ^M^J.
(5)/c = " ":"~"

L'unique règle de Deux_colonnes extrait deux lignes consécutives ( lignes (2) et (3)). La première est stockée dans la variable GAUCHE et la seconde dans la variable DROITE.

La fin d'une ligne est marquée par des caractères non affichables ( ^M^J ) : le patron de fouille 0~ c extrait zéro ou plus caractères affichables mais ne les extrait donc pas plus loin que la fin de la ligne.

Le résultat de la règle de Deux_colonnes (ligne (3)) est ensuite construit, avec la ligne de gauche cadrée à gauche sur quarante positions, suivie du contenu intégral de la ligne de droite et d'une fin de ligne.