Manière la plus facile de découper une chaîne sur les retours à la ligne dans .NET?
J'ai besoin de découper une chaîne en retours à la ligne dans .NET et le seul moyen que je connaisse pour diviser les chaînes de la Split méthode. Cependant qui me le permettent pas (facilement) split sur un saut de ligne, alors quel est le meilleur moyen de le faire?
- Pourquoi ne serait-il pas? Divisée sur le Système.De l'environnement.De retour à la ligne
- Mais vous avez de l'envelopper dans un string[] et ajouter un argument supplémentaire et... il se sent juste maladroit.
Vous devez vous connecter pour publier un commentaire.
À split, sur une chaîne, vous devez utiliser la surcharge qui prend un tableau de chaînes de caractères:
Edit:
Si vous voulez gérer les différents types de sauts de ligne dans un texte, vous pouvez utiliser la capacité de correspondre à plus d'une corde. Ce sera correctement séparées sur un type de saut de ligne, et de préserver les lignes vides et de l'espacement dans le texte:
Environment.NewLine
propriété contient la valeur par défaut de retour à la ligne pour le système. Pour un système Windows par exemple, il sera"\r\n"
.\n
laissant un\r
à la fin de chaque ligne, puis d'indiquer les lignes avec un\r\n
entre eux.\r
et\n
des séquences d'échappement (entre autres) ont une signification particulière pour le compilateur C#. VB n'ont pas de ces séquences d'échappement, donc il y a ces constantes sont utilisées à la place.Environment.NewLine
constante est conçue spécialement pour les cadres sur d'autres systèmes, et contient la nouvelle ligne de la combinaison de ce système. Pour traiter un dossier qui contient des retours à la ligne, vous pouvez utiliser le code qui correspond à des chaînes différentes.Environment.NewLine
, lorsque nous avons essayé d'utiliser à nouveaustring[] { "\r\n", "\n" }
il s'est écrasé à notre application sur OSX.theText.Split(...).ToList();
Que sur l'utilisation d'un
StringReader
?Vous devriez être en mesure de séparer votre chaîne assez facilement, comme suit:
Essayez d'éviter d'utiliser de la chaîne.Split pour une solution générale, parce que vous allez utiliser plus de mémoire partout où vous utilisez la fonction -- la chaîne d'origine, et la séparation de la copie, à la fois dans la mémoire. Faites-moi confiance que cela peut être un enfer d'un problème lorsque vous commencez à l'échelle -- exécute une version 32 bits de lot-application de traitement de traitement de 100 mo de documents, et vous aurez la merde à huit threads simultanés. Non pas que j'ai été là avant...
Au lieu de cela, utiliser un itérateur comme cela;
Cela vous permettra d'être plus efficace en terme de mémoire en boucle autour de vos données;
Bien sûr, si vous le voulez tout en mémoire, vous pouvez le faire;
blah.SplitToLines..
par exempledocument.SplitToLines...
?this
dans les paramètres formels en faire une méthode d'extension.Basé sur Guffa réponse, dans une classe d'extension, utilisez:
Pour une variable de chaîne
s
:Cette les utilisations de votre environnement définition de fins de ligne. Sur Windows, les fins de ligne sont CR-LF (retour chariot, saut de ligne) ou en C#, s'échapper les caractères
\r\n
.C'est une solution fiable, parce que si vous recombiner les lignes avec
String.Join
, ce qui correspond à votre chaîne d'origine:À ne pas faire:
StringSplitOptions.RemoveEmptyEntries
, parce que cela va casser de balisage tels que Markdown où des lignes vides ont syntaxique but.new char[]{Environment.NewLine}
, parce que sous Windows, cela va créer une chaîne vide élément pour chaque nouvelle ligne.Regex est également une option:
"\r?\n"
.J'ai juste pensé que je voudrais ajouter mes deux bits, parce que les autres solutions sur cette question, ne tombez pas dans le code réutilisable classement et ne sont pas commodes.
Le bloc de code suivant s'étend le
string
objet de sorte qu'il est disponible comme une méthode naturelle lorsque l'on travaille avec des chaînes.Vous pouvez maintenant utiliser le
.Split()
fonction à partir de n'importe quelle chaîne comme suit:À split sur un caractère de saut de ligne, il suffit de passer
"\n"
ou"\r\n"
comme séparateur de paramètres.Commentaire: Ce serait bien si Microsoft a mis en place cette surcharge.
Environment.Newline
est préféré au codage en dur, soit\n
ou\r\n
.Environment.Newline
est pour la croix-plate-forme de compatibilité, pas pour travailler avec des fichiers à l'aide de différents les fins de ligne que le système d'exploitation actuel. Voir ici pour plus d'information, donc cela dépend vraiment de ce que le développeur travaille avec. L'utilisation deEnvironment.Newline
assure il n'y a aucune cohérence dans la ligne type de retour entre les OS, où "codage en dur' permet au développeur de contrôle total..Newline
n'est pas de la magie, sous le capot c'est juste les cordes, comme prévu ci-dessus basé sur un commutateur de si elle est en cours d'exécution sur unix ou windows. Le pari le plus sûr, est d'abord de faire une chaîne de caractères à remplacer pour tous "\r\n", puis diviser sur les "\n". Où à l'aide de.Newline
échoue, c'est quand vous travaillez avec des fichiers qui sont enregistrés par d'autres programmes qui utilisent une méthode différente pour les sauts de ligne. Cela fonctionne bien si vous le savez, chaque fois que le fichier lu est de toujours utiliser les sauts de ligne de votre système d'exploitation actuel.Je suis actuellement à l'aide de cette fonction (sur la base d'autres réponses) dans VB.NET:
Il essaie de se diviser sur la plate-forme locale de retour à la ligne en premier, et puis retombe à chaque retour à la ligne.
J'ai seulement besoin de ce à l'intérieur d'une classe jusqu'à présent. Si cela change, je vais probablement faire de ce
Public
et le déplacer vers une classe utilitaire, et peut-être même en faire une méthode d'extension.Voici comment rejoindre les lignes de back up, pour faire bonne mesure:
"\r"
= retour ."\r\n"
= retour + nouvelle ligne. ( veuillez consulter ce post et les solution retenue iciBien, en fait divisé devrait le faire:
La RemoveEmptyStrings option vous serez sûr de ne pas avoir des entrées vides en raison d' \n à la suite d'une \r
(Modifier pour tenir compte des commentaires:) a Noter qu'il sera également jeter véritable lignes vides dans le texte. C'est généralement ce que je veux, mais il pourrait ne pas être votre exigence.
Je ne savais pas à propos de l'Environnement.De ligne, mais je suppose que c'est une très bonne solution.
J'essaie aurait été:
Supplémentaires .Trim supprime tout \r ou \n qui pourrait être encore présent (e. g. quand sur windows, mais le découpage d'une chaîne avec os x caractères de saut de ligne). Probablement pas la méthode la plus rapide si.
EDIT:
Que les commentaires justement fait remarquer, cela supprime également tous les espaces au début de la ligne ou de l'avant de la nouvelle ligne d'alimentation. Si vous avez besoin de préserver des espaces, utilisez l'une des autres options.
Réponse idiote: écrire dans un fichier temporaire, de sorte que vous pouvez utiliser le vénérable
Fichier.ReadLines
var
, car elle ne permet pas de définir le type de variable, de sorte que vous ne peut pas comprendre comment utiliser cet objet, ou ce que l'objet représente. De Plus, cette montre écrit les lignes et n'a même pas spécifier un nom de fichier, donc je doute qu'il serait de travailler. Puis, lors de la lecture, le chemin du fichier n'est pas spécifié. En supposant quepath
estC:\Temp\test.txt
, vous devriez alors avoirstring[] lines = File.ReadLines(path);
.Path.GetTempFileName
msdn.microsoft.com/en-us/library/... et il est dit, il crée un zéro octet fichier & renvoie la "le chemin d'accès complet du fichier". Je pourrais jurer que j'ai essayé cela avant et il a donné une exception car elle ne trouve pas un fichier, mais a été renvoyé à un emplacement de dossier, à la place. Je sais que les arguments pour l'utilisation devar
, mais je dirais qu'il n'est PAS recommandé car il ne montre pas ce que la variable objet. Il dissimule elle.Très facile, en fait.
VB.NET:
C#:
Environment.NewLine
tout comme dans VB.