Module d’import générique

Format général des filtres

<?xml version="1.0" encoding="utf-8" ?>
<catalogfilter version="2">
        <filter name="Visible name" type="xls" />

        <zones>
                <zone name="work" level="work" col="1" isactivecol="C" isactiveregex="^(\d+|)$">
                        <field name="title" col="A" ghregex="Title/Alternate Title\(s\)">
                                <helper type="regex" when="beforepost" find="\s+" replace="" />
                        </field>

                        <newrec>
                                <condition type="change" field="title" />
                        </newrec>

                        <onpost>
                                <![CDATA[
                                Begin
                                        if getstring('title')=getstring('subtitle') then
                                                putstring('subtitle','');
                                End.
                                ]]>
                        </onpost>
                </zone>
        </zones>
        <lookups>
                <lookup name="abatprix" valuetype="integer">
                        <entry key="FULL" value="1" />
                </lookup>
        </lookups>

</catalogfilter>

Filter

<filter name="filtername" type="xls|csv|fix" />

Attributs :

Attribut Obligatoire Explication
name Oui Le nom du filtre tel qu’il apparaîtra dans la liste
type Oui Le type de fichier : xls ou csv ou fix
maxheader Non Le nombre de lignes où chercher les en-têtes (par défaut = 20)
delim si type=’csv’
Le délimiteur à utiliser (par défaut ”,”).
* tab ou $09 pour les tabulations
* auto pour détection automatique
engine Non
Le moteur de lecture à utiliser
* si type=”xls” : “xlsrw” ou “cx”
* si type=”csv” ou “fix” : “fileread[.encoding]” ou “memorymap”
(où encoding peut être UTF8, CP437, ANSI, ASCII)
reconcile Non
Par défaut : “Non”. Si le moteur de lecture est “fileread”,
essayer de “recoller” les
lignes qui contiennent des retour chariot.
unquote Non
Par défaut : “Non”.
Nettoyer les champs s’ils commencent et finissent par des “

Zones

<zone name="zonename" attributes="..." />
Liste des attributs de zones
Attribut Obligatoire Explication
name Oui Le nom du filtre tel qu’il apparaîtra dans la liste
level Oui Le nom du niveau (facultatif si clone)
col Oui La position où commence la zone (ou auto si ghregex)
clone Non Nom de la zone à cloner
parent Spécial Sur les imports multi-niveaux, définit le nom de la zone parente
ghregex Non
Permet de repérer la zone (mettre col=”auto”) et de définir les champs
avec col=+0 ou col=+2

Lookups (tables de correspondances)

<lookups>
        <lookup name="tors" valuetype="string">
                <entry key="LP" value="S" />
                <entry key="VIDEO TRACK" value="T" />
        </lookup>
</lookups>

Champs (fields)

<field name="title" col="A" />
Liste des attributs de champs
Attribut Obligatoire Explication
name Oui Le nom du champ tel que défini par l’appelant
col Oui

La position du champ

  • numéro de colonne
  • colonne Excel (A-Z, AA, AB, etc.)
  • n,l : n = numéro de colonne, l=longueur (pour les types “fix”)
  • +n : numéro de colonne relativement à la zone (+0 pour le premier champ)
  • auto : la colonne sera trouvée avec ghregex
ghregex Non Regex de l’en-tête pour contrôle ou découverte (si col=auto)
readasstring Non
Si “1” le champ sera lu/vu comme une chaîne jusqu’à son
enregistrement ce qui permet de lui appliquer des regex,
eval et autres helpers
defaultvalue Non Valeur par défaut si le champ est vide
forcedvalue Non Valeur du champ forcée
optional Non “1” si le champ n’est pas systématiquement présent dans les fichiers
checktype Non
  • regex
  • change
checkregex Oui Si checktype = regex
onfail Oui
  • null : le champ est nullifié
  • empty : le champ est vidé
  • ignorerec : l’enregistrement est ignoré
  • ignoretab : arrêt du traitement de l’onglet courant
  • fatalerror : le traitement est interrompu
onfailmessage fatalerror
Message affiché en cas d’erreur fatale
(%s pour afficher un contenu capturé par la regex)
acceptif Non
Raccourci pour
checktype=regex + readasstring + OnFail=IgnoreRec
ignoreif Non
Raccourci pour
checktype=regex + readasstring + OnFail=IgnoreRec (regex=!regex)
fatalif Non
Raccourci pour
checktype=regex + readasstring + OnFail=FatalError (regex=!regex)
Il est possible de préciser un onfailmessage
fatalifnot Non
Raccourci pour
checktype=regex + readasstring + OnFail=FatalError + onfailmessage
Il est possible de préciser un onfailmessage
keytype Non
  • primary : ce champ est unique et toujours présent
  • unique : ce champ est unique ou vide
  • fallback
codetype si keytype Type de code à associer
sticky Non La valeur du champ est mémorisée pour les lignes suivantes où cette valeur serait vide
isactivecol Non Colonne où vérifier isactiveregex
isactiveregex Non regex à vérifier pour que la ligne soit prise en compte
fillbeforeheadersfound Non
“1” pour les champs Sticky dont les valeurs sont
définies avant que tous les en-têtes aient été trouvés
clearhelpers Non Pour les zones clonées, “1” supprime les helpers hérités

Contrôles

Avant de prendre en compte une donnée, plusieurs contrôles peuvent être effectués :

checkactive
Permet de vérifier, à un autre endroit de la ligne, que le champ qu’on s’apprête à lire est bien celui qu’on croit. Sur les fichiers de type “fix”, cela permet par exemple de s’assurer que le type d’enregistrement est celui attendu.
check
Permet de vérifier la validité de la donnée et de déterminer quoi faire dans le cas contraire (ignorer la ligne, le fichier ou interrompre le traitement si l’erreur rencontrée indique un fichier corrompu ou invalide)

Les traitements sont effectués dans cet ordre :

  1. Vérifier que le champ est bien défini (certains champs sont facultatifs)
  2. Appliquer les helpers checkactive
  3. Vérifier que le champ est bien actif (checkactive)
  4. Appliquer les helpers afterread
  5. Vérifier la validité de la donnée (check)
  6. Appliquer les helpers beforepost

Helpers

<helper type="regex" when="beforepost" find="xxx" replace="yyy" else="zzz" />

When

afterheaderread
N’est utilisé que dans la phase de recherche d’en-têtes, avant de vérifier si ceux-ci répondent au(x) critère(s) attendu(s).
beforecheckactive
Traitement appliqué aux champs checkactive (donc généralement pas le champ lui-même mais peut être utilisé pour opérer une transformation de la donnée uniquement aux fins de vérification en la gardant intacte)
afterread
Effectué avant de vérifier la conformité de la donnée
beforepost
Effectué après vérification de conformité mais avant stockage
userdefined
Non utilisé actuellement

Types

lowercase
Force le champ en minuscules.
uppercase
Force le champ en capitales
trim
Élimine les espaces de début et de fin (déjà fait à la lecture du champ)
lpad

remplit à gauche avec un caractère pour atteindre une longueur prédéfinie. Si le champ est déjà trop long, il est tronqué.

fill:caractère à utiliser pour combler
length:longueur à atteindre
rpad

remplit à droite avec un caractère pour atteindre une longueur prédéfinie. Si le champ est déjà trop long, il est tronqué.

fill:caractère à utiliser pour combler
length:longueur à atteindre
round2
Arrondit le champ (float) à 2 chiffres après la virgule
round8
Arrondit le champ (float) à 8 chiffres après la virgule
eval
Évaluation mathématique du champ (par exemple 100/2)
regex

Recherche un motif et le remplace par une chaîne. Les portions isolées par des parenthèses sont remplacées par $1, $2, etc.

find:motif à rechercher
replace:chaîne par laquelle remplacer
regexeval

Combine regex et eval. Par exemple :

find:^(.*)$
replace:$1/2
regexelse

Recherche le motif find et remplace l’ensemble de la chaîne par replace en cas de succès ou par else en cas d’échec ou de champ vide/nul.

find:motif à rechercher
replace:chaîne par laquelle remplacer
else:chaîne alternative
split

Récupère le N-ième élément en séparant le champ lu sur un ou plusieurs caractères

splitchars:un ou plusieurs caractères qui serviront à séparer les éléments
count:le N-ième élément à récupérer
userdefined

Permet au module appelant (ImportCatalogues) de définir un helper particulier à appliquer juste avant d’enregistrer les données.

udname:nom du helper qui sera reconnu par l’appelant
lookup

Permet de transformer une valeur lue par une autre, définie dans une table de correspondance

lookup:nom de la table de correspondance

Code

Actuellement, chaque zone peut avoir un code associé, placé dans une directive <onpost />. Outre le langage Pascal standard, les fonctions suivantes sont disponibles :

getstring(name)
getinteger(name)
getfloat(name)

Récupère la valeur d’un champ

name:nom du champ à récupérer
putstring(name,value)
putinteger(name,value)
putfloat(name,value)

Stocke des données dans un champ

name:nom du champ
value:valeur à stocker
TestRegex(str,expression,options:String):Boolean

Vérifie si une chaîne matche une expression régulière

str:chaîne à tester
expression:regex
options:“i” pour ignorer MAJ/min
Eval(str):Integer
DEval(str):Double
Convertit une chaîne en nombre (ou zéro si la chaîne ne représente pas un nombre)
GetLastSerial(level:str):Integer
Retourne la dernière clé primaire pour le niveau indiqué
Reload(zonename:str; index:integer)
Recharge les champs de la zone zonename avec les données de la clé primaire index
Resave
Écrase les données de l’enregistrement rechargé (avec Reload) après modifications
abortzone
Invalide les données de la zone, comme si un check avait échoué et retourné ignorerec
abortthisline
Non implémenté
abortwholefile
Interrompt le traitement du fichier entier
debug(text)
Écrit sur la console lorsque l’utilisateur a choisi de voir les informations de débogage
log(text)
Écrit sur la console