REGROUPEMENTS ET REPETITIONS

De la façon dont la transformation International vient d'être réécrite, on remarque qu'il devient vite fastidieux d'associer un nom de variable à chaque caractère recherché. Deux mécanismes permettent de simplifier cette définition:

Les regroupements

On peut regrouper entre parenthèses plusieurs patrons de fouille, séparés par des virgules.


Un patron de fouille peut lui-même être composé d'un ensemble de sous-patron indiqués entre parenthèses:

(sous-patron, ..., sous-patron)

Ce patron de fouille se vérifie donc lorsque tous ses sous-patron se vérifient. La portion des données en entrée qui correspond à l'ensemble des sous-patrons peut alors être stockée dans une seule variable.


Par exemple:

CODE_POSTAL ('A':'Z', '0':'9', 'A':'Z', ' ',
'0':'9', 'A':'Z', '0':'9')

retient un code postal complet dans la variable CODE_POSTAL .

Les répétitions simples


Un patron de fouille peut comporter un facteur de répétition. Les données recherchées devront être présentes en entrée le nombre de fois spécifié par ce facteur pour que le patron se vérifie.

Par exemple: 20"":"~" se vérifie lorsque 20 caractères affichables sont rencontrés en entrée les uns à la suite des autres.


La transformation International peut donc se réécrire:
(1)/International:
(2)MOIS ('0':'1','0':'9'), '/',
(3)JOUR ('0':'3','0':'9'), '/',
(4)ANNEE 2 '0':'9'
(5)= ANNEE, '-', MOIS, '-', JOUR.

Les regroupements de patrons de fouille et les facteurs de répétition peuvent être combinés et imbriqués à loisir.

L'assignation à une variable peut intervenir à n'importe quel niveau:

ANNEE_COMPLETE (SIECLE 2 '0':'9' , ANNEE 2 '0':'9')

Ce patron recherche une année de quatre chiffres et assigne:

Ceci permet d'extraire un champ d'information en entier, et en même temps composante par composante.

Voici un autre exemple utilisant les possibilités offertes par les regroupements et les répétitions:

ASS_MALADIE(INITIALES_NOM3 'A':'Z',
INITIALE_PRENOM'A':'Z', ' ',

4 '0':'9' , ' ', 4 '0':'9')

Ce patron repère un numéro d'assurance maladie et le stocke dans la variable ASS_MALADIE, tout en retenant les lettres des initiales dans les variables INITIALES_NOM (trois premières lettres du nom de famille) et INITIALE_ PRENOM (première lettre du prénom).

TYPES DE DONNÉES

Les patrons de fouille que vous pouvez maintenant construire sont en mesure de traduire des données assez complexes. Il arrive toutefois souvent qu' un même patron de fouille soit utilisé à plusieurs endroits dans vos directives: vous devez alors réécrire ce patron autant de fois que les mêmes conditions s'appliquent au fichier d'entrée.

La définition de types de donnée qui est introduite ici permet de pallier à cet inconvénient.


Un type de données se définit par un nom associé à un patron de fouille. Dans l'énoncé d'une règle ADAPT, il suffit d'indiquer le nom du type de données indique son nom et le patron de fouille qui y est associé de la façon suivante:

La directive ADAPT pour définir un type de donnée indique sonnom et le patron de fouille qui est associé de la façon suivante:

/nom = patron

Par exemple, /lettre = "a": "z"est l'énoncé qui associe au nom lettreun patron qui se vérifie pour une lettre.


En définissant les types de donnée suivants:

/M = 'A':'Z'
/d = '0':'9'

il est beaucoup plus facile d'écrire les exemples du chapitre REGROUPEMENTS ET REPETITIONS de la façon suivante:

CODE_POSTAL ( M, d, M, ' ', d, M, d )
ANNEE_COMPLETE (SIECLE 2 d, ANNEE d)

ou aussi:

ASS_MALADIE(INITIALES_NOM 3 M, INITIALE_PRENOM M,
' ', 4 d, ' ', 4 d)

Dans ces exemples, M équivaut donc à un patron qui se vérifie pour une lettre majuscule, et d équivaut donc à un patron qui se vérifie pour un chiffre.

On peut maintenant écrire la transformation International sous une forme très compacte:

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

dd est donc un type de données qui équivaut au patron de fouille 2 '0':'9'. Ce patron de fouille se vérifie lorsque deux caractères numériques sont rencontrés dans les données en entrée.

Les définitions de type de données peuvent apparaître n'importe où avant, après ou entre les transformations qui les utilisent (mais pas au beau milieu des règles d'une transformation).

La description des données à transformer peut maintenant être rendue beaucoup plus lisible, concise et modulaire.

Par exemple, il est utile de prendre l'habitude de définir toujours de la même façon des types de données très fréquents, ainsi:

/c = " ":"~"pour décrire un caractère affichable;
/d = '0':'9'pour décrire un chiffre;
/L = "a":"z"pour décrire une lettre sous n'importe quelle forme ( majuscule, minuscule ou accentuée);
/M = 'A':'Z'pour décrire une lettre majuscule;

et aussi:

/Code = M,d,M,' ',d,M,dpour décrire un code postal.

La lecture de vos fichiers de règles sera dorénavant bien plus aisée. De même, vos fichiers de directives se conformeront plus rapidement à toute modification dans la structure des données, grâce à la possibilité de ne modifier que certains énoncés de types.

QUELQUES EXEMPLES COMPLETS

  1. Envoi de données à dBase II

    Un commercant désire traiter une liste de ses clients avec dBase II (m.c.de Ashton-Tate), un logiciel de gestion de banque de données très populaire. Il avait déjà créé cette liste avec son traitement de texte et le format qu'il a utilisé ne correspond malheureusement pas aux exigences syntaxiques de dBase II. La liste originale contient les informations sous la forme suivante:

    Nom du client           (514)         842-0150          H2V 3W1
    
    30 colonnes code nº de tél. code postal régional

    Quant à la banque de donnée définie avec dBase II, elle contient 4 champs:

    Nom:24 caractères
    Code postal:7 caractères
    Région:nombre de 3 chiffres
    Téléphone:8 caractères

    Le logiciel dBase II demande de reçevoir dans l'ordre suivant les quatre champs d'information, séparés par des virgules et avec les informations textuelles entre apostrophes.

    Par exemple:

    'Nom du client'         ,'H2V3W1'     ,514,             '842-0150'
    
    24 colonnes code code nº de tél. postal régional

    Voici une simple transformation qui permet d'adapter la liste des clients originale aux exigences de dBase II:

    (1)/dBaseII:
    (2)NOM 24 c, 6 c, '(', REGION 3 d, ')',
    (3)TELEPHONE 8 c, CODE_POSTAL Code
    (4)= "'", NOM, "','", CODE_POSTAL, "',",
    (5)REGION, ",'", TELEPHONE, "'".
    (6)/Code = M,d,M,' ',d,M,d
    (7)/c = ' ':'~'
    (8)/M = 'A':'Z'
    (9)/d = '0':'9'

    La transformation dBaseII contient une seule règle, dont les patrons de fouille (lignes (2) et (3)) se vérifient pour la séquence d'informations suivante:

    un NOM de 24 caractères
    6 caractères (extraits mais inutilisés par la suite)
    une parenthèse ouvrante ( ( )
    un numéro de REGION de trois chiffres
    une parenthèse fermante ( ) )
    un numéro de TELEPHONE de huit caractères
    un CODE_POSTAL canadien (de la forme Z9Z 9Z9)

    Lorsque ces patrons se vérifient (donc pour chaque ligne de la liste originale), le résultat (lignes (4) et (5)) est inscrit dans le fichier de sortie (des guillemets( " ) y entourent les caractères àinscrire tels quels):

    'NOM','CODE',REGION,'TELEPHONE'

    Tous les caractères en entrée, pour lesquels les patrons de fouille ne se vérifient pas, sont recopiés tels quels dans le fichier de sortie: les fins de ligne (retour de chariot, etc.) sont donc transmises intégralement entre chaque ligne de données.

    Imaginons maintenant que notre commercant désire traiter avec les mêmes directives une liste contenant des adresses américaines, où le code postal est construit différemment.

    Il n'aura alors qu'un seul énoncé ADAPT à modifier (la ligne (6) ), pour que tous les patrons de fouille comprenant le type de donnée Code soient conformes à la nouvelle convention:

    /Code = 2 M, 5 d

    Les codes postaux américains comportent en effet deux majuscules suivies de 5 chiffres.

  2. Validation d'un fichier de données

    A la suite d'une enquête auprès de 5000 personnes, des chercheurs désirent calculer diverses mesures sur les réponses obtenues. Comme le nombre de ré pondants est élevé, ils décident d'avoir recours à l'informatique pour le traitement statistique des réponses à l'enquête. Celles-ci ont été codées selon des valeurs numériques, et un fichier de données comprenant une ligne de codes de réponses par personne est créé.

    Avant d'effectuer les calculs statistiques, les chercheurs désirent cependant s' assurer que ce fichier ne contient pas de fautes de frappe: ils veulent donc vérifier si chaque information présente dans le fichier a un code valide.

    Les directives suivantes permettent de détecter et de lister les lignes du fichier contenant des données invalides:

    (1)/Vérifier_le_fichier :
    (2)Indiv,Sexe,Etat_matrimonial,Revenu,5 Oui_Non, ^M^J
    (3)= .
    (4)/Indiv = 4 d
    (5)/Sexe = '1':'2'
    (6)/Etat_matrimonial = '1':'5'
    (7)/Revenu = 5 d
    (8)/Oui_Non = '0':'2'
    (9)/d = '0':'9'

    La transformation Vérifier_le_fichier est composée d'une seule règle: ses patrons de fouille (ligne (1)) décrivent l'ensemble des caractères valides pour chaque champ du fichier en entrée.

    Les symboles ^M^J représentent une fin de ligne (retour de chariot, changement de ligne) et sont expliqués en détail au chapitre CARACTERES SPECIAUX.

    Si ce patron se vérifie, c'est-à-dire que la ligne ne comporte aucune erreur, le résultat correspondant ( = . à la ligne (3)) est incrit en sortie. Ce résultat est vide! Les lignes valides (de même que leurs fins de ligne) sont dès lors absentes du fichier de sortie.

    Par contre, dès qu'un caractère ne correspond pas aux exigences d'un des patrons de fouille, la règle ne peut pas s'appliquer et toute la ligne contenant l'erreur est recopiée intégralement en sortie. Il est donc ensuite très simple d'effectuer les corrections nécessaires.