Back to Blog
TutorielMay 2, 202210 min

Maudit enfer des formats de données

Gérer des formats de données complexes et des changements peut être intimidant. Découvrez comment layline.io relève ce défi en utilisant un langage de grammaire configurable.

Maudit enfer des formats de données

Contexte

Vous êtes la personne chargée de gérer et de faire fonctionner l'infrastructure de traitement des données chez ACME Corp. C'est cette machinerie complexe et sensible qui effectue tout le travail lourd de manipulation des données dans votre entreprise, mais qui ne reçoit jamais de reconnaissance pour cela. C'est la pompe qui ne doit jamais s'arrêter de pomper, c'est le moteur qui fait tourner la machine.

Et pourtant, lorsque vos parents, vos amis, voire vos collègues vous demandent ce que vous faites chez ACME, ils s'endorment au milieu de votre explication enthousiaste.

Soyons honnêtes : vous ne recevez pas assez de reconnaissance pour ce que vous faites pour le monde 🙃

Défis

Le travail que vous faites ne nécessite pas de courir partout en tenue de mécanicien, mais on a souvent l'impression que vous devez constamment observer, réparer, corriger et simplement insuffler une nouvelle énergie dans cette infrastructure de traitement des données.

Bien qu'il y ait de nombreux défis au quotidien, l'un d'eux concerne LE CHANGEMENT. Oui, on dit qu'il ne faut jamais changer un système qui fonctionne, mais ce n'est pas ainsi que le monde tourne. L'un des changements les plus fréquents est …

Changement de format de données

AAHHHH ! Alerte rouge … sirènes hurlantes … ! Lorsqu'il s'agit de changement de format de données, vous voyez souvent plusieurs défis se présenter en même temps :

  1. Les interfaces de données sont souvent codées en dur dans un code source. Vous ne pouvez pas simplement les "modifier" (comme le suggère votre patron), ou du moins ce n'est pas si simple.
  2. Pendant la migration, les données sont reçues à la fois dans l'ancien et le nouveau format. Même avec un petit changement, cela représente toujours deux formats différents qui doivent être traités en parallèle.
  3. Ce n'est pas juste une question d'ajouter un champ. Parfois, c'est une structure de données entière qui est ajoutée, avec tout un tas d'autres éléments en même temps.
  4. Les données modifiées peuvent nécessiter une gestion interne d'informations supplémentaires, etc. Là encore, des éléments peuvent être codés en dur, et le code doit donc être modifié pour s'adapter.
  5. Vous êtes à court de café. Cela n'aide pas.

Nous avons ici deux problèmes majeurs :

  1. La modification du code et
  2. la gestion de la migration de format.

Cela peut s'avérer être un véritable casse-tête et nécessiter de longs cycles de planification, développement, publication, test et, enfin, déploiement.

S'il existait seulement un moyen plus simple et plus rapide de faire tout cela …

Les formats de données génériques à la rescousse

layline.io propose des formats de données génériques qui ne peuvent pas résoudre tous les défis mentionnés ci-dessus, mais la plupart d'entre eux, la plupart du temps.

Qu'est-ce que les formats de données génériques ?

Comme son nom l'indique, ce concept permet de définir des formats de données de manière générique. Pour ce faire, il fournit :

  1. un langage pour définir la structure (grammaire) du format que vous essayez de maîtriser.
  2. Ce langage utilise des expressions régulières pour définir et identifier les éléments individuels d'une structure, puis
  3. les sous-éléments de cette structure, etc.
  4. Il est orienté objet, ce qui signifie que vous pouvez définir et réutiliser les structures d'éléments partout.

À quoi ressemble ce langage ?

Voyons cela. Pour cet exemple, nous allons travailler avec un format de données très simple, qui est séparé par des virgules, doit contenir un enregistrement d'en-tête, 1..n enregistrements de détail et un enregistrement de bande-annonce.

Exemple de données d'un journal de transactions bancaires simple :

H;Sample Bank Transactions
D;20-Aug-2021;NEFT;23237.00;00.00;37243.31
D;21-Aug-2021;NEFT;00.00;3724.33;33518.98
T;100

Et voici comment ce format est défini dans layline.io en utilisant le langage de grammaire générique :

format {
  name = "Bank Transactions" 
  description = "Random bank transactions"

  start-element = "File"
  target-namespace = "BankIn"

  elements = [
    // File sequence
    {
      name = "File"
      type = "Sequence"
      references = [
        { name = "Header", referenced-element = "Header" },
        { name = "Details", max-occurs = "unlimited", referenced-element = "Detail" },
        { name = "Trailer", referenced-element = "Trailer" }
      ]
    },
    // Header record 
    {
      name = "Header"
      type = "Separated"
      regular-expression = "H"
      separator-regular-expression = ";"
      separator = ";"
      terminator-regular-expression = "\n"
      terminator = "\n"
      mapping = { message = "Header", element = "BT_IN" }
      parts = [
        { name = "RECORD_TYPE", type = "RegExpr", regular-expression = "[^;\n]*", value.type = "Text.String" },
        { name = "FILENAME", type = "RegExpr", regular-expression = "[^;\n]*", value.type = "Text.String" }
      ]
    },
    // Detail record
    {
      name = "Detail"
      type = "Separated"
      // ... similar structure
    },
    // Trailer record
    {
      name = "Trailer"
      type = "Separated"
      // ... similar structure
    }
  ]
}

L'élément format

Tout commence avec l'élément de haut niveau format :

Outre un name et une description, il dispose également d'un tableau d'elements. Ces éléments définissent un certain nombre de sous-éléments (classes), qui peuvent être de différents types.

L'élément File de type Sequence

Cet élément définit une structure logique de sous-éléments dans sa structure references :

Vous pouvez deviner que nous construisons ici un arbre :

Conclusion préliminaire

Nous avons appris que le fonctionnement du langage de grammaire est le suivant :

  1. Une grammaire se compose d'un certain nombre d'éléments
  2. Ces éléments ont différents types qui servent à des fins distinctes
  3. L'élément initial est format, qui pointe vers un élément de départ
  4. Vous pouvez définir un nombre quelconque d'éléments supplémentaires
  5. Certains éléments peuvent ensuite référencer d'autres éléments

Qu'en est-il des formats plus complexes ?

Voici ce qui fonctionne également :

  • Formats ASCII/Unicode très complexes
  • Analyse conditionnelle des données via la gestion de l'état du parseur conditionnel
  • Structures binaires
  • Un mélange de formats ASCII et binaires

Nous pensons que cela couvre plus de 80 % de tous les formats d'échange de données.

Prise en charge de plusieurs formats

Vous pouvez définir autant de formats que vous le souhaitez. layline.io compile tous ces formats en un "super-format" à l'exécution. Cela vous permet de :

  • référencer tous les formats depuis n'importe où
  • mapper des données d'un format à un autre
  • créer de nouvelles instances de messages basées sur un format spécifique
  • ingérer ou exporter des données dans l'un des formats définis

Où configurer tout cela ?

Nous avons fourni une interface utilisateur conviviale pour vous aider à effectuer toutes les configurations. Vous pouvez la trouver dans le Configuration Center basé sur le web de layline.io sous Project --> Formats --> Generic Format :

Et ce n'est pas tout. Pendant que vous définissez votre grammaire, vous pouvez télécharger un fichier de données d'exemple et voir côte à côte si votre grammaire correspond à la structure du fichier de données :

Plutôt cool, non ?

Référencement des données dans la logique

Une fois que vous avez défini une ou plusieurs grammaires dans layline.io, vous pouvez ensuite accéder à des éléments et des structures individuels à l'intérieur :

Exemple : Accès aux données dans un Mapping Asset

Exemple : Accès aux données dans un Javascript Asset

Gestion des changements de format

En revenant sur les défis dont nous avons parlé au début, il devrait maintenant être plus clair à quel point il est facile de s'adapter aux changements de format.

  • Besoin d'un champ supplémentaire ? Ajoutez-le simplement à la grammaire.
  • Besoin d'une structure d'enregistrement entière supplémentaire ? Encore une fois, ajoutez-la simplement à la grammaire.
  • Besoin de prendre en charge une ancienne et une nouvelle version d'un enregistrement de détail en même temps ? Facile : vous pouvez insérer un élément Choice pour permettre soit une version Detail-Old, soit une version Detail-New.
  • Besoin de calculer un contenu basé sur un autre contenu ? Ajoutez simplement des formules.

Tout est pris en charge.

Ressources

#Description
1Documentation : Getting Started
2Documentation : Generic Format Asset
3Projet exemple : Output to Kafka
Share:

Enjoyed this article?

Subscribe to get more insights delivered to your inbox.