Diviser une chaîne en lignes dans .NET : 5 erreurs fatales et leurs solutions

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : Pourquoi une simple division de chaîne devient-elle un casse-tête ?

\n

Que 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 ? ».

\n

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\n

Top 5 des erreurs lors de la division d'une chaîne en lignes en C#

\n\n

1. Utilisation naïve de '\\n' — le tueur de la multiplateforme

\n

L'erreur la plus courante est de coder en dur le caractère de nouvelle ligne. Beaucoup écrivent :

\n
string text = "Première ligne\\nDeuxième ligne\\nTroisième ligne";\nstring[] lines = text.Split('\\n');
\n

Problè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.

\n

Solution : Utilisez StringSplitOptions.RemoveEmptyEntries et divisez selon toutes les variantes possibles :

\n
string[] lines = text.Split(new[] { "\\r\\n", "\\r", "\\n" }, \n    StringSplitOptions.RemoveEmptyEntries);
\n

Ce code traitera correctement toute combinaison de caractères de saut de ligne.

\n\n

2. Ignorer Environment.NewLine à l'exécution

\n

Si 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.

\n

Piège : Vous écrivez :

\n
string[] lines = text.Split(Environment.NewLine);
\n

Cela 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 !

\n

Bonne pratique : Utilisez toujours la méthode universelle du point 1, quelle que soit la plateforme.

\n\n

3. Oublier StringSplitOptions.RemoveEmptyEntries

\n

Regardez ce code :

\n
string text = "Ligne1\\n\\nLigne3";\nstring[] lines = text.Split('\\n');\n// Résultat : ["Ligne1", "", "Ligne3"]
\n

La 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.

\n

Solution :

\n
string[] lines = text.Split(new[] { "\\r\\n", "\\r", "\\n" }, \n    StringSplitOptions.RemoveEmptyEntries);\n// Résultat : ["Ligne1", "Ligne3"]
\n

Mais soyez prudent : si les lignes vides ont une importance (par exemple, dans un texte formaté), utilisez StringSplitOptions.None.

\n\n

4. Problème avec le dernier caractère de nouvelle ligne

\n

Imaginez que vous ayez un fichier avec le texte :

\n
Ligne1\\nLigne2\\n
\n

Beaucoup s'attendent à obtenir un tableau de deux éléments après la division. Mais :

\n
string[] lines = text.Split(new[] { '\\n' }, StringSplitOptions.RemoveEmptyEntries);\n// Résultat : ["Ligne1", "Ligne2"]
\n

Tout est correct. Et si on enlève RemoveEmptyEntries ?

\n
string[] lines = text.Split('\\n');\n// Résultat : ["Lig                

Blogs

Book Recommendations