Exemple : Créer des hiérarchies à partir de fichiers CSV et de fichiers texte à longueur fixe
Cet exemple est disponible à l'emplacement suivant : <Documents>\Altova\MapForce2027\MapForceExamples\DocExamples\Tut-headerDetail.mfd. L'exemple utilise un fichier CSV (Orders.csv) présentant le format suivant :
•Champ 1 : H définit un enregistrement d'en-tête et D un enregistrement de détail.
•Champ 2 : Une clé commune aux enregistrements d'en-tête et de détail.
•Chaque enregistrement d'en-tête ou de détail occupe une ligne distincte.
Le contenu du fichier Orders.csv est présenté ci-dessous.

L'objectif de ce mappage est le suivant :
•Mapper le fichier plat CSV vers un fichier XML hiérarchique
•Filtrer les enregistrements d'en-tête, désignés par un H
•Associer les enregistrements de détail correspondants, désignés par un D, à chacun des enregistrements d'en-tête.

tut-headerDetail.mfd
Pour y parvenir, les enregistrements d'en-tête et de détail doivent partager un champ commun. Dans ce cas, le champ commun, ou clé, est le deuxième champ du fichier CSV, à savoir OrderNo. Dans le fichier CSV, tant le premier enregistrement d’en-tête que les deux enregistrements de détail suivants contiennent la valeur commune 111.
Le fichier Orders.csv a été inséré deux fois afin de rendre le mappage plus intuitif.
Le fichier de schéma Tut-headerDetail.xsd présente une structure hiérarchique : Order est l’élément racine, avec Header comme élément enfant, et Detail comme élément enfant de Header.
Le premier fichier Orders.csv fournit les enregistrements Header (et tous les champs mappés) à l’élément Header du fichier de schéma cible. Le composant de filtrage est utilisé pour filtrer tous les enregistrements autres que ceux commençant par H. L’élément Rows fournit ces enregistrements filtrés à l’élément Header du fichier de schéma.
Le deuxième fichier Orders.csv fournit les enregistrements Detail (et tous les champs mappés) en filtrant les enregistrements Detail qui correspondent à la clé OrderNo de l’enregistrement Header. Pour ce faire :
•Comparez le champ OrderNo de l’enregistrement Header avec le même champ des enregistrements Detail, à l’aide de la fonction equal (le contexte de priorité est défini sur le paramètre a pour améliorer les performances).
•Utilisez la fonction Logical-and pour ne fournir que les enregistrements Detail contenant la même valeur dans le champ OrderNo que l’enregistrement Header.
L’élément Rows fournit ces enregistrements filtrés aux éléments Header et Detail du fichier de schéma, via le paramètre on-true du composant de filtrage.
Un clic sur le volet Output génère le fichier XML affiché ci-dessous. Chaque enregistrement Header contient ses propres données, ainsi que tous les enregistrements de détail associés qui possèdent le même Order No.

Examinons à présent un autre exemple, qui utilise un fichier CSV légèrement différent et qui est disponible dans le dossier DocExamples sous le nom Head-detail-inline.mfd. La différence réside dans le fait que :
• Aucun indicateur d’enregistrement (H ou D) n’est disponible
•Un champ-clé commun, le premier champ du fichier CSV, existe toujours pour les enregistrements d’en-tête et de détail (Head-key, Detail-key…). Ce champ est mappé sur OrderNo dans le schéma cible
•Les champs Header et tous les champs Detail correspondants se trouvent tous sur la même ligne.
Le mappage a été conçu comme suit :
•Les champs-clés sont mappés aux éléments OrderNo correspondants dans le schéma cible.
•L’élément Detail du fichier de schéma cible a été dupliqué et s’affiche sous le nom Detail (2). Cela vous permet de mapper le deuxième ensemble d’enregistrements de détail à l’élément approprié.
•Le résultat de ce mappage est fondamentalement le même fichier XML que celui généré dans le premier exemple.

Head-detail-inline.mfd