2010-01-02 38 views
1

我有一個字節數組(例如byte [] data),其中包含具有自定義行分隔符的文本,例如:「\ r \ n」(CRLF 「\ x0D \ x0A」),「\ r」,「\ n」,「\ x0D \ x0A \ x0D」或甚至「@」。C#逐行讀取文本,其中行分隔符是自定義的

目前我打算採用如下方案:

  1. 規範化換行符CRLF(這裏有一個例子如何規範CRLF What is a quick way to force CRLF in C#/.NET?
  2. 使用StringReader通過閱讀文本行線

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

我使用C#,.NET 3.5。 有沒有更好的解決方案?

謝謝。

+1

你應該將你的行結束標準化爲'\ n',它只需要2個替換而不是3個。注意你的鏈接中的答案首先標準化爲'\ n',只有在這之後''n' r \ N'。 – 2010-01-02 17:36:47

+0

是的,事實證明,我需要將行尾標記爲以下任一項:「\ r」,「\ n」,「\ r \ n」 http://msdn.microsoft.com/en-us /library/system.io.stringreader.readline.aspx 一行被定義爲一個字符序列,後跟一個換行符(「\ n」),一個回車符(「\ r」)或一個回車立即返回然後換行(「\ r \ n」)。結果字符串不包含終止回車和/或換行符。如果已到達基礎字符串的末尾,則返回值爲空引用(在Visual Basic中爲Nothing)。 – 2010-01-02 17:46:43

+0

爲了獲得最快的性能,您可以手動分割它... – 2010-01-02 18:39:04

回答

1

這裏有一個選項可以將對string.Replace的調用限制爲僅限於多字符分隔符。

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

再後來......

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

謝謝。這是一個很好的解決方案! – 2010-01-02 17:54:27

0

使用正則表達式來代替,它會給你更大的靈活性。