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.