Correction de fichiers corrompus par des sauts de lignes intempestifs
Dans le cas d'imports de fichiers text, csv, etc... vers une base de données SQL, les sauts de lignes non-souhaités (souvent issus de champs Notes, des zones de texte, tags <BR>
, tabulations ou autre HTML mal interprêtés...) sont très pénibles. Ils peuvent faire échouer les imports ou vous faire perdre du temps. Explorer son fichier sous Notepad est parfois nécessaire.
Nous allons commencer par quelques tests bien utiles pour prendre connaissance d'un fichier, mais dont nous verrons qu'ils sont insuffisants. Nous finirons par une Correction complète en 4 temps .
Chercher les lignes qui ne commencent pas avec tel caractère
Si vos débuts de ligne sont censés commencer par des guillemets double par exemple (champs entourés par "
, ce système d'enclosure SQL est très répandu, c'est pourquoi nous l'utilisons ici).
En Mode de recherche Expressions régulières, vous pouvez tester les lignes ne commençant pas avec ces guillemets double ainsi :
^[^"]
Le 1er chapeau signifie en début de ligne. Les crochets délimitent l'ensemble à tester. Le 2nd chapeau, entre crochets, signifie qui n'est pas (une fois inclu dans l'ensemble, dans les crochets). Les guillemets double sont le caractère à tester (à remplacer en fonction de vos besoins).
L'expression régulière ci-dessus vous renverra donc aux lignes ne commençant pas avec des guillemets double, mais en vous sélectionnant aussi le 1er caractère de la ligne. Atention donc aux remplacements sous cette forme.
Une autre méthode est de chercher les sauts de ligne (au lieu du début de ligne), de cette façon :
\n[^"]
L'expression \n
signifiant un saut de ligne. Ce qui vous renverra toujours aux lignes ne commençant pas avec des guillemets double, mais toujours en vous sélectionnant 1er caractère de la ligne. Ce n'est donc pas non plus idéal pour des remplacements précis (sauf pour des chaînes de texte redondantes en défaut, en les faisant une-par-une si elles sont peu nombreuses, ou si on les connaît à l'avance).
Chercher les lignes commençant avec un caractère alphanumérique
Dans ce cas précis, une méthode inverse donnerait le même résultat, en recherchant cette fois les lignes commençant avec un caractère alphanumérique (lettres, chiffres et underscore, grâce à l'expression \w
). Et donc ne commençant pas par un guillemet double :
\n[\w]
Ou
^[\w]
Mais là encore ce n'est pas idéal pour des corrections précises et sans perte, puisque un remplacement élimine toujours le 1er caractère des lignes corrompues.
Correction complète en 4 temps
Comment donc gérer efficacement ces sauts de lignes ?
Dans notre exemple, nous souhaitons traiter les lignes ne commençant pas avec des guillemets double au sein d'un fichier où les lignes saines commencent avec des guillemets double.
Nous allons procéder en 4 temps :
1) Remplacement de tous les sauts de ligne correctement enclosés et du 1er guillemet double par une chaîne complexe, volontairement choisie pour être totalement absente du fichier :
Rechercher \r\n^["]
Remplacer par xxxxxyzf123456789fzyxxxxx"
Le nombre de lignes de votre fichier va nettement diminuer, et vous allez visualiser sans peine les éventuelles erreurs.
2) Remplacement de tous les sauts de lignes restants (les corrompus) par un espace :
Rechercher \r\n
Remplacer par
L'espace est nécessaire afin de ne pas concaténer les chaînes illogiquement séparées par des sauts de lignes.
Là encore votre fichier maigrit à vue d'œil. Si vous regardez bien les curseurs de Notepad, vous verrez aussi que sa longueur a augmenté.
3) Remplacement de tous les sauts de lignes encore restants (je ne sais expliquer ceux-ci, sans doute une question d'encodage) par un espace également :
Rechercher \n
Remplacer par
Vous n'obtenez alors plus qu'une seule loooonnngue ligne. C'était l'objectif.
4) Parfait, vous n'avez plus qu'à remplacer dans cette ligne unique notre fameuse chaine complexe par des sauts de lignes suivis d'un guillemet.
Tous les sauts de ligne ayant été supprimés, vous serez ainsi sûr de ne rétablir que les sauts de lignes nécessaires au début de chaque enregistrement :
Rechercher xxxxxyzf123456789fzyxxxxx"
Remplacer par \r\n"
La ligne à rallonge reprend la forme d'un fichier standard, mais sans les sauts de lignes non-voulus, bon pour import !