2010-08-23 5 views

Répondre

3

Utilisez String.Split Method (String[], StringSplitOptions) comme ceci:

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

Celui-ci fonctionnera indépendamment de savoir si la source est écrite avec Windows linebreak \r\n ou Unix \n.

Comme d'autres réponses mentionnent, vous pouvez utiliser StringSplitOptions.RemoveEmptyEntries au lieu de StringSplitOptions.None qui, comme son nom l'indique, supprime des chaînes vides (" " ne sont pas admissibles à être vide, ne "" DOE).

+0

Vous pouvez ajouter Mac: '\ r' comme bien et '\ x0085' pour IBM (voir [cette note]) (http://www.w3.org/TR/newline)) :) – Abel

+0

Je ne savais pas qu'ils avaient' \ r' mais je vois que c'est seulement ' Mac OS <= 9' donc ils ne sont pas pertinents. –

+0

La constante correcte est System.Environment.NewLine. –

0

Essayez

string[] items = source.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); 
+2

Il ne déclare pas qu'il veut supprimer les entrées vides . –

0
string text = "Hello \r\n this is a test \r\n tested"; 
string[] lines = text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); 
foreach (string line in lines) { 
    System.Diagnostics.Debug.WriteLine(line); 
} 

Vous pouvez utiliser le overloads of System.String.Split d'utiliser un seul caractère, tableau de caractères, ou un tableau de valeurs de chaîne comme délimiteurs pour séparer la chaîne. StringSplitOptions spécifie s'il faut ou non conserver les lignes vides ou les supprimer. (Vous voudriez les conserver par exemple si vous divisez un texte multiligne tel qu'un paragraphe, mais que vous les supprimerez dans un exemple d'une liste de noms)

1

En plus de string.Split qui est mentionné, vous peut également utiliser Regex.Split, mais il est souvent plus utile pour les modèles de split plus compliqués.

var lines = Regex.Split(source, @"\r\n"); 
+0

Je dirais que regex serait la meilleure solution; si vous souhaitez également supprimer l'espace avant et après le retour à la ligne, ou lorsqu'il n'y a pas de retour chariot. La regex serait quelque chose comme ça: @ "* \ r? \ N *" –

+0

@Andre: Je suis d'accord quand vous n'êtes pas sûr à 100% de l'entrée. Ensuite, vous pouvez obtenir une meilleure division floue avec regex. Si vous créez vous-même les fichiers, cela peut ne pas être nécessaire. –

0

Pour plus de clarté, j'ai apporté une autre réponse.

J'ai fait ces deux méthodes d'extension:

ReadLines vous permettra de lire une ligne à l'époque sans analyse de la chaîne entière dans un tableau. ReadAllLines analysera la ligne entière dans un tableau.

Dans votre cas, vous pouvez l'utiliser comme:

var lines = source.ReadAllLines(); 

J'ai pris les noms de File.ReadLines et File.ReadAllLines donc ils doivent être compatibles avec le reste du framework .Net.

Comme une note de côté aux commentaires sur mon autre réponse, j'ai vérifié le code de StringReader.ReadLine et cela prennent soin des deux \r\n et \n - mais pas l'ancien héritage Mac Os, etc. (ne devrait pas être important).

public static class StringExtensions 
{ 
    public static IEnumerable<string> ReadLines(this string data) 
    { 
     using (var sr = new StringReader(data)) 
     { 
      string line; 

      while ((line = sr.ReadLine()) != null) 
       yield return line; 
     } 
    } 

    public static string[] ReadAllLines(this string data) 
    { 
     var res = new List<string>(); 

     using (var sr = new StringReader(data)) 
     { 
      string line; 

      while ((line = sr.ReadLine()) != null) 
       res.Add(line); 
     } 

     return res.ToArray(); 
    } 
} 

(ReadAllLines aurait pu être fait avec ReadLines.ToArray mais j'ai décidé que les quelques lignes supplémentaires de code était mieux qu'un enveloppé IEnumerable qui prend un certain temps de traitement)

Questions connexes