Introduction : Pourquoi une simple division de chaîne devient-elle un casse-tête ?
\nQue pourrait-il y avoir de plus simple que de diviser un texte en lignes ? Tout débutant en C# dirait : « Utilise string.Split('\\n') et le tour est joué ! ». Mais en pratique, cette tâche apparemment triviale devient la source de centaines de bugs que nous voyons sur Stack Overflow. Des milliers de développeurs posent chaque jour la même question : « split a string on newlines in .NET — pourquoi cela ne fonctionne-t-il pas chez moi ? ».
Dans cet article, nous ne nous contenterons pas de donner une recette toute faite. Nous passerons en revue les pièges dans lesquels même les programmeurs expérimentés sont tombés. Vous apprendrez à diviser correctement des chaînes en tenant compte des différentes plateformes, encodages et formats de fichiers inattendus. Attachez votre ceinture — ce sera douloureux mais utile.
\n\nTop 5 des erreurs lors de la division d'une chaîne en lignes en C#
\n\n1. Utilisation naïve de '\\n' — le tueur de la multiplateforme
\nL'erreur la plus courante est de coder en dur le caractère de nouvelle ligne. Beaucoup écrivent :
\nstring text = "Première ligne\\nDeuxième ligne\\nTroisième ligne";\nstring[] lines = text.Split('\\n');\nProblème : Sous Windows, le séparateur standard est "\\r\\n" (retour chariot + saut de ligne), tandis que sous Linux/macOS, c'est simplement '\\n'. Si vous recevez un texte provenant d'un fichier créé sous Windows, votre code laissera le caractère '\\r' à la fin de chaque ligne. Résultat : "Première ligne\\r" — et votre analyseur devient fou.
Solution : Utilisez StringSplitOptions.RemoveEmptyEntries et divisez selon toutes les variantes possibles :
string[] lines = text.Split(new[] { "\\r\\n", "\\r", "\\n" }, \n StringSplitOptions.RemoveEmptyEntries);\nCe code traitera correctement toute combinaison de caractères de saut de ligne.
\n\n2. Ignorer Environment.NewLine à l'exécution
\nSi vous écrivez du code qui fonctionnera à la fois sous Windows et Linux (par exemple, une application ASP.NET Core), vous ne pouvez pas vous fier à des constantes. Environment.NewLine renvoie le séparateur correct pour le système d'exploitation actuel, mais ne garantit pas que les données d'entrée correspondent à ce système.
Piège : Vous écrivez :
\nstring[] lines = text.Split(Environment.NewLine);\nCela fonctionnera uniquement si le texte a été créé sur la même plateforme. Si vous chargez un fichier téléchargé depuis Internet (où les lignes peuvent être au style Unix) — bonjour le bug !
\nBonne pratique : Utilisez toujours la méthode universelle du point 1, quelle que soit la plateforme.
\n\n3. Oublier StringSplitOptions.RemoveEmptyEntries
\nRegardez ce code :
\nstring text = "Ligne1\\n\\nLigne3";\nstring[] lines = text.Split('\\n');\n// Résultat : ["Ligne1", "", "Ligne3"]\nLa chaîne vide entre "Ligne1" et "Ligne3" apparaît à cause de deux caractères de nouvelle ligne consécutifs. Si vous traitez des CSV, des logs ou des fichiers de configuration, les lignes vides peuvent casser la logique.
\nSolution :
\nstring[] lines = text.Split(new[] { "\\r\\n", "\\r", "\\n" }, \n StringSplitOptions.RemoveEmptyEntries);\n// Résultat : ["Ligne1", "Ligne3"]\nMais soyez prudent : si les lignes vides ont une importance (par exemple, dans un texte formaté), utilisez StringSplitOptions.None.
4. Problème avec le dernier caractère de nouvelle ligne
\nImaginez que vous ayez un fichier avec le texte :
\nLigne1\\nLigne2\\n\nBeaucoup s'attendent à obtenir un tableau de deux éléments après la division. Mais :
\nstring[] lines = text.Split(new[] { '\\n' }, StringSplitOptions.RemoveEmptyEntries);\n// Résultat : ["Ligne1", "Ligne2"]\nTout est correct. Et si on enlève RemoveEmptyEntries ?
string[] lines = text.Split('\\n');\n// Résultat : ["Lig