Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#逐行读取文本,其中行分隔符是自定义的_C#_.net - Fatal编程技术网

C#逐行读取文本,其中行分隔符是自定义的

C#逐行读取文本,其中行分隔符是自定义的,c#,.net,C#,.net,我有一个字节数组(比如byte[]data),其中包含带有自定义行分隔符的文本,例如:“\r\n”(CRLF“\x0D\x0A”)、“\r”、“\n”、“\x0D\x0A\x0D”甚至“@” 目前,我将使用以下解决方案: 将换行符规格化为CRLF(以下是如何规格化CRLF的示例) 使用StringReader逐行读取文本 using (String Reader sr = new StringReader(data.ToString())) { string line; whi

我有一个字节数组(比如byte[]data),其中包含带有自定义行分隔符的文本,例如:“\r\n”(CRLF“\x0D\x0A”)、“\r”、“\n”、“\x0D\x0A\x0D”甚至“@”

目前,我将使用以下解决方案:

  • 将换行符规格化为CRLF(以下是如何规格化CRLF的示例)
  • 使用StringReader逐行读取文本

    
    using (String Reader sr = new StringReader(data.ToString()))
    {
        string line;
        while ((line = sr.ReadLine()) != null)
        {
            // Process the line 
        }
    }
    
  • 我正在使用C#,.NET3.5。 有没有更好的解决办法


    谢谢。

    这里有一个选项可以限制对
    字符串的调用。将
    替换为仅使用多字符分隔符

    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
    }
    

    这里有一个选项可以限制对
    字符串的调用。将
    替换为仅使用多字符分隔符

    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
    }
    

    改用regexp,这将为您提供更大的灵活性

    改用regexp,这将给您带来更大的灵活性

    您应该将行尾标准化为
    \n
    ,这只需要2次替换,而不是3次。请注意,在您的链接中,答案首先规范化为
    \n
    ,然后才将
    \n
    更改为
    \r\n
    。是的,事实证明,我需要将行尾改为以下任意一种:“\r”、“\n”、“\r\n”行定义为一个字符序列,后跟换行符(“\n”)、回车符(“\r”),或紧接着换行符(“\r\n”)的回车符。结果字符串不包含终止回车和/或换行符。如果已到达基础字符串的结尾,则返回值为空引用(在Visual Basic中为Nothing)。为了获得最快的性能,您可以手动拆分它…您应该将行结尾规范化为
    \n
    ,这只需要2次替换,而不是3次。请注意,在您的链接中,答案首先规范化为
    \n
    ,然后才将
    \n
    更改为
    \r\n
    。是的,事实证明,我需要将行尾改为以下任意一种:“\r”、“\n”、“\r\n”行定义为一个字符序列,后跟换行符(“\n”)、回车符(“\r”),或紧接着换行符(“\r\n”)的回车符。结果字符串不包含终止回车和/或换行符。如果已到达基础字符串的结尾,则返回的值为空引用(在Visual Basic中为Nothing)。为了获得最快的性能,可以手动拆分它。。。