Question Le moyen le plus simple de diviser une chaîne sur les nouvelles lignes dans .NET?


Je dois diviser une chaîne en newlines dans .NET et la seule façon que je connaisse de séparer les chaînes est avec le Divisé méthode. Cependant, cela ne me permettra pas (facilement) de partager une nouvelle ligne, alors quelle est la meilleure façon de le faire?


632
2017-10-10 09:25


origine


Réponses:


Pour diviser sur une chaîne, vous devez utiliser la surcharge qui prend un tableau de chaînes:

string[] lines = theText.Split(
    new[] { Environment.NewLine },
    StringSplitOptions.None
);

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 l'un ou l'autre type de saut de ligne et préservera les lignes vides et l'espacement dans le texte:

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

1126
2017-10-10 09:29



Qu'en est-il d'utiliser un StringReader?

using (System.IO.StringReader reader = new System.IO.StringReader(input)) {
    string line = reader.ReadLine();
}

83
2017-11-14 01:10



Vous devriez pouvoir séparer votre chaîne assez facilement, comme ceci:

aString.Split(Environment.NewLine.ToCharArray());

36
2017-10-10 09:29



Basé sur la réponse de Guffa, dans une classe d'extension, utilisez:

public static string[] Lines(this string source) {
    return source.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
}

22
2018-06-02 15:34



Essayez d'éviter d'utiliser string.Split pour une solution générale, car vous utiliserez plus de mémoire partout où vous utiliserez la fonction - la chaîne d'origine et la copie partagée, à la fois en mémoire. Croyez-moi que cela peut être un sacré problème quand vous commencez à l'échelle - exécutez une application de traitement par lots de 32 bits traitant des documents de 100 Mo, et vous ferez des erreurs à huit threads simultanés. Pas que j'aie été là avant ...

Au lieu de cela, utilisez un itérateur comme celui-ci;

    public static IEnumerable<string> SplitToLines(this string input)
    {
        if (input == null)
        {
            yield break;
        }

        using (System.IO.StringReader reader = new System.IO.StringReader(input))
        {
            string line;
            while( (line = reader.ReadLine()) != null)
            {
                yield return line;
            }
        }
    }

Cela vous permettra de faire une boucle de mémoire plus efficace autour de vos données;

foreach(var line in document.SplitToLines()) 
{
    // one line at a time...
}

Bien sûr, si vous voulez tout en mémoire, vous pouvez le faire;

var allTheLines = document.SplitToLines.ToArray();

19
2018-05-01 12:49



Pour une variable de chaîne s:

s.Split(new string[]{Environment.NewLine},StringSplitOptions.None)

Cela utilise la définition de fin de ligne de votre environnement. Sous Windows, les fins de ligne sont CR-LF (retour chariot, saut de ligne) ou dans les caractères d'échappement de C # \r\n.

C'est une solution fiable, car si vous recombinez les lignes avec String.Join, ceci est égal à votre chaîne d'origine:

var lines = s.Split(new string[]{Environment.NewLine},StringSplitOptions.None);
var reconstituted = String.Join(Environment.NewLine,lines);
Debug.Assert(s==reconstituted);

Ce qu'il ne faut pas faire:

  • Utilisation StringSplitOptions.RemoveEmptyEntries, parce que cela va casser le balisage tel que Markdown où les lignes vides ont un but syntaxique.
  • Séparer sur le séparateur new char[]{Environment.NewLine}, car sur Windows cela va créer un élément de chaîne vide pour chaque nouvelle ligne.

8
2017-10-04 15:56



Regex est également une option:

    private string[] SplitStringByLineFeed(string inpString)
    {
        string[] locResult = Regex.Split(inpString, "[\r\n]+");
        return locResult;
    }

6
2018-01-09 21:45