J'ai besoin de diviser une chaîne en sauts de ligne dans .NET et la seule façon que je sache de diviser les chaînes est avec la méthode Split . Cependant, cela ne me permettra pas (facilement) de diviser sur une nouvelle ligne, alors quelle est la meilleure façon de le faire?
806
Réponses:
Pour diviser sur une chaîne, vous devez utiliser la surcharge qui prend un tableau de chaînes:
Modifier:
si vous souhaitez gérer différents types de sauts de ligne dans un texte, vous pouvez utiliser la possibilité de faire correspondre plusieurs chaînes. Cela se divisera correctement sur chaque type de saut de ligne et préservera les lignes vides et l'espacement dans le texte:
la source
Environment.NewLine
propriété contient la nouvelle ligne par défaut du système. Pour un système Windows par exemple ça le sera"\r\n"
.\n
laissant un\r
à la fin de chaque ligne, puis sort les lignes avec un\r\n
entre elles.\r
et\n
(entre autres) ont une signification particulière pour le compilateur C #. VB n'a pas ces séquences d'échappement, donc ces constantes sont utilisées à la place.Et si vous utilisiez un
StringReader
?la source
while
boucle qui devrait être ajoutée à cette réponse.Vous devriez pouvoir diviser votre chaîne assez facilement, comme ceci:
la source
Essayez d'éviter d'utiliser string.Split pour une solution générale, car vous utiliserez plus de mémoire partout où vous utilisez la fonction - la chaîne d'origine et la copie fractionnée, toutes deux en mémoire. Croyez-moi, cela peut être un sacré problème lorsque vous commencez à évoluer - exécutez une application de traitement par lots 32 bits traitant des documents de 100 Mo, et vous vous retrouverez à huit threads simultanés. Non pas que j'y ai été avant ...
Utilisez plutôt un itérateur comme celui-ci;
Cela vous permettra de faire une boucle plus efficace en mémoire autour de vos données;
Bien sûr, si vous voulez tout garder en mémoire, vous pouvez le faire;
la source
blah.SplitToLines..
par exempledocument.SplitToLines...
?this
dans les paramètres formels ce qui en fait une méthode d'extension.Sur la base de la réponse de Guffa, dans une classe d'extension, utilisez:
la source
Pour une variable chaîne
s
:Cela utilise la définition des fins de ligne de votre environnement. Sous Windows, les fins de ligne sont CR-LF (retour chariot, saut de ligne) ou en caractères d'échappement C #
\r\n
.C'est une solution fiable, car si vous recombinez les lignes avec
String.Join
, cela équivaut à votre chaîne d'origine:Ce qu'il ne faut pas faire:
StringSplitOptions.RemoveEmptyEntries
, car cela rompra le balisage tel que Markdown où les lignes vides ont un objectif syntaxique.new char[]{Environment.NewLine}
, car sous Windows, cela créera un élément de chaîne vide pour chaque nouvelle ligne.la source
Regex est également une option:
la source
"\r?\n"
.Je pensais simplement que j'ajouterais mes deux bits, car les autres solutions sur cette question ne tombent pas dans la classification de code réutilisable et ne sont pas pratiques.
Le bloc de code suivant étend l'
string
objet afin qu'il soit disponible comme méthode naturelle lorsque vous travaillez avec des chaînes.Vous pouvez maintenant utiliser la
.Split()
fonction à partir de n'importe quelle chaîne comme suit:Pour diviser un caractère de nouvelle ligne, passez simplement
"\n"
ou"\r\n"
comme paramètre de délimiteur.Commentaire: Ce serait bien si Microsoft implémentait cette surcharge.
la source
Environment.Newline
est préférée pour coder en dur soit\n
ou\r\n
.Environment.Newline
est pour la compatibilité multiplateforme, pas pour travailler avec des fichiers utilisant des terminaisons de ligne différentes de celles du système d'exploitation actuel. Voir ici pour plus d'informations , donc cela dépend vraiment de ce avec quoi le développeur travaille. L'utilisation deEnvironment.Newline
assure qu'il n'y a pas de cohérence dans le type de retour de ligne entre les systèmes d'exploitation, où le «codage en dur» donne au développeur un contrôle total..Newline
n'est pas magique, sous le capot, ce sont juste les cordes comme indiqué ci-dessus, basées sur un commutateur si il fonctionne sur unix ou sur windows. Le pari le plus sûr est de faire d'abord un remplacement de chaîne pour tous les "\ r \ n", puis de diviser sur "\ n". Lorsque l'utilisation.Newline
échoue, c'est lorsque vous travaillez avec des fichiers enregistrés par d'autres programmes qui utilisent une méthode différente pour les sauts de ligne. Cela fonctionne bien si vous savez que chaque fois que le fichier lu utilise toujours les sauts de ligne de votre système d'exploitation actuel.foo = foo.Replace("\r\n", "\n"); string[] result = foo.Split('\n');
. Ai-je bien compris que cela fonctionne sur toutes les plateformes?J'utilise actuellement cette fonction (basée sur d'autres réponses) dans VB.NET:
Il essaie d'abord de se diviser sur la nouvelle ligne locale de la plate-forme, puis revient à chaque nouvelle ligne possible.
Pour l'instant, je n'en ai eu besoin que dans une seule classe. Si cela change, je ferai probablement ceci
Public
et le déplacer vers une classe utilitaire, et peut-être même en faire une méthode d'extension.Voici comment joindre les lignes de sauvegarde, pour faire bonne mesure:
la source
"\r"
= retour."\r\n"
= retour + nouvelle ligne. (veuillez consulter cet article et la solution acceptée iciEh bien, en fait, le split devrait faire:
la source
L' option RemoveEmptyStrings s'assurera que vous n'avez pas d'entrées vides car \ n suit un \ r
(Modifier pour refléter les commentaires :) Notez qu'il supprimera également les véritables lignes vides dans le texte. C'est généralement ce que je veux, mais ce n'est peut-être pas votre exigence.
la source
Je ne connaissais pas Environment.Newline, mais je suppose que c'est une très bonne solution.
Mon essai aurait été:
Le .Trim supplémentaire supprime tous les \ r ou \ n qui pourraient être encore présents (par exemple, sur Windows mais en divisant une chaîne avec des caractères de nouvelle ligne os x). Ce n'est probablement pas la méthode la plus rapide.
ÉDITER:
Comme les commentaires l'ont correctement souligné, cela supprime également tout espace au début de la ligne ou avant le nouveau saut de ligne. Si vous devez conserver cet espace, utilisez l'une des autres options.
la source
Réponse idiote: écrivez dans un fichier temporaire pour pouvoir utiliser le vénérable
File.ReadLines
la source
var
, car il ne définit pas le type de variable, de sorte que vous ne pouvez pas comprendre comment utiliser cet objet, ou ce que cet objet représente. De plus, cela montre l'écriture des lignes et ne spécifie même pas de nom de fichier, donc je doute que cela fonctionnerait. Ensuite, lors de la lecture, le chemin d'accès au fichier n'est à nouveau pas spécifié. En supposant quepath
c'est le casC:\Temp\test.txt
, vous devriez alors l'avoirstring[] lines = File.ReadLines(path);
.Path.GetTempFileName
msdn.microsoft.com/en-us/library/… et il dit qu'il crée un fichier de zéro octet et renvoie "le chemin complet de ce fichier". Je pourrais jurer que j'ai essayé avant et cela a donné une exception car il n'a pas trouvé de fichier, mais a été renvoyé à la place. Je connais les arguments pour l'utilisationvar
, mais je dirais que ce n'est PAS recommandé car il ne montre pas ce qu'est l'objet variable. Il l'obscurcit.la source
Très facile, en fait.
VB.NET:
C #:
la source
Environment.NewLine
comme en VB.