2010-01-02 6 views
1

J'ai un tableau d'octets (par exemple byte [] data), qui contient du texte avec des délimiteurs de ligne personnalisés, par exemple: "\ r \ n" (CRLF "\ x0D \ x0A"), "\ r", "\ n", "\ x0D \ x0A \ x0D" ou même "@".C# lire un texte ligne par ligne, où le délimiteur de ligne est personnalisé

En ce moment je vais utiliser la solution suivante:

  1. casse ligne Normaliser CRLF (ici un exemple comment normalise CRLF What is a quick way to force CRLF in C#/.NET?)
  2. Utilisez StringReader lire la ligne de texte par ligne

    
    using (String Reader sr = new StringReader(data.ToString())) 
    { 
        string line; 
        while ((line = sr.ReadLine()) != null) 
        { 
         // Process the line 
        } 
    } 
    

J'utilise C#, .NET 3.5. Y a-t-il une meilleure solution?

Merci.

+1

Vous devriez normaliser vos fins de ligne à '\ n', qui ne prend que 2 remplacements au lieu de 3. Notez dans votre lien que la réponse se normalise d'abord à' \ n' et seulement après cela change '\ n'' '\ r \ n'. –

+0

Yup, Il s'avère que j'ai besoin de ne pas maliser les fins de ligne à l'un des suivants: "\ r", "\ n", "\ r \ n" http://msdn.microsoft.com/fr-fr /library/system.io.stringreader.readline.aspx Une ligne est définie comme une séquence de caractères suivie d'un saut de ligne ("\ n suivi d'un saut de ligne ("\ r \ n"). La chaîne résultante ne contient pas le retour de chariot de terminaison et/ou le saut de ligne. La valeur renvoyée est une référence null (Nothing en Visual Basic) si la fin de la chaîne sous-jacente a été atteinte. –

+0

Pour une performance plus rapide, vous pouvez le diviser à la main ... –

Répondre

1

Voici une option pour limiter les appels à string.Replace aux seuls délimiteurs multi-caractères.

private static readonly char[] DelimiterChars = { '\r', '\n', '@' }; 
private static readonly string[] DelimiterStrings = { "\r\n\r", "\r\n" }; 

Puis, plus tard ...

string text = Encoding.ASCII.GetString(data); 
foreach (string delim in DelimiterStrings) 
    text = text.Replace(delim, "\n"); 

foreach (string line in text.Split(DelimiterChars)) 
{ 
    // processing here 
} 
+0

Merci. C'est une bonne solution! –

0

Utilisez regexp à la place, ce qui vous donnera beaucoup plus de flexibilité.

Questions connexes