Intégrer sans filet

Cette semaine, mon mandat m’a donné une job qui a l’air banale sur papier: prendre un fichier que le client reçoit d’un fournisseur, pis rentrer ça dans la base de données. « C’est juste un import », qu’on m’a dit. Spoiler: c’est jamais juste un import.

Le fichier, c’est un texte avec des champs séparés par des points-virgules. Belle théorie. Dans la vraie vie, y’a des lignes vides, des dates écrites de trois façons différentes, des montants avec des virgules pis des points mélangés, pis une ligne d’en-tête qui revient parfois au milieu du fichier. Pas de validation à la source. Pas de filet. C’est moi le filet.

Lire la ligne, pas la faire confiance

Ma première version était naïve: je splittais sur le point-virgule pis je rentrais ça direct. Ça a planté à la troisième ligne. Oh non, j’ai fait planter l’import au complet sur une seule date croche. Leçon numéro un: une mauvaise ligne ne doit jamais faire tomber tout le reste.

Dim ligne As String
Dim noLigne As Integer = 0
Dim rejets As New ArrayList()

While Not sr.EndOfStream
    ligne = sr.ReadLine()
    noLigne += 1
    If ligne.Trim() = "" Then Continue While

    Dim champs() As String = ligne.Split(";"c)
    Try
        Dim p As New Produit()
        p.Code = champs(0).Trim()
        p.Prix = Decimal.Parse(champs(2), CultureInfo.InvariantCulture)
        InsererProduit(p)
    Catch ex As Exception
        rejets.Add("Ligne " & noLigne & ": " & ex.Message)
    End Try
End While

L’idée, c’est que chaque ligne se débrouille toute seule. Si elle pète, elle va dans la liste des rejets pis l’import continue. À la fin, je sors un petit rapport des lignes refusées. Pas très glorieux, mais c’est ça qui sauve la journée quand le fournisseur envoie n’importe quoi.

Le parcours d’une ligne

flowchart TD
    A[Lire une ligne] --> B{Ligne vide?}
    B -->|Oui| A
    B -->|Non| C[Découper les champs]
    C --> D{Données valides?}
    D -->|Non| E[Ajouter aux rejets]
    D -->|Oui| F[Insérer dans SQL]
    E --> A
    F --> A

Ce petit schéma-là, je l’ai dessiné sur un coin de feuille avant de coder. Ça m’a évité de tout mélanger validation, insertion pis gestion d’erreur dans le même paquet de spaghetti.

Ce que j’en retire

Intégrer sans filet, c’est comprendre que la donnée qui rentre est toujours plus sale que promis. Le vrai travail, c’est pas l’insertion: c’est tout ce qui entoure la mauvaise ligne. Un import qui réussit à 100 % le premier coup, c’est suspect. Un import qui te dit clairement ce qu’il a refusé pis pourquoi, ça, c’est utile. C’est ce genre de détail-là qui fait qu’un client te rappelle pour le prochain mandat.