如何读取一个只用LF分隔的文件中的每一行?

3

我需要逐行读取一个日志文件,该文件大小约为6MB,共有40000行。但是在测试我的程序后,我发现该日志文件只使用LF字符作为分隔符。因此,我无法使用StreamReader类的Readline方法。

我该如何解决这个问题?

编辑:我尝试使用文本阅读器,但我的程序仍然无法正常工作:

using (TextReader sr = new StreamReader(strPath, Encoding.Unicode))
            {


                sr.ReadLine(); //ignore three first lines of log file
                sr.ReadLine(); 
                sr.ReadLine();

                int count = 0; //number of read line
                string strLine;
                while (sr.Peek()!=0)
                {
                    strLine = sr.ReadLine();
                    if (strLine.Trim() != "")
                    {
                        InsertData(strLine);
                        count++;
                    }
                }

                return count;
            }
4个回答

10

TextReader.ReadLine方法已经处理了仅由\n结尾的行。

根据文档

一行被定义为一系列字符,后面跟着一个回车符(0x000d)、一个换行符(0x000a)、一个回车符后跟一个换行符、Environment.NewLine或流结束标记。返回的字符串不包含终止的回车和/或换行符。如果已到达输入流的末尾,则返回值为 null 引用(在 Visual Basic 中为 Nothing)。

因此,基本上你应该没问题了。(我谈论了TextReader而不是StreamReader,因为这是方法声明的地方 - 显然它仍将与StreamReader一起工作。)

如果您想轻松迭代每行(并可能使用LINQ针对日志文件),则可能会发现我在MiscUtil中的LineReader类很有用。它基本上将对ReadLine()的调用包装在一个迭代器中。所以例如,您可以这样做:

var query = from file in Directory.GetFiles("logs")
            from line in new LineReader(file)
            where !line.StartsWith("DEBUG")
            select line;

foreach (string line in query)
{
    // ...
}

所有内容都已经开始流式传输了 :)


4
File.ReadAllLines(fileName)不能正确加载以LF结尾的文件吗?如果需要整个文件,可以使用它-我看到一个网站表明它比另一种方法慢,但如果你传递正确的编码(默认为UTF-8),它就不会慢,并且它是最简洁的。
编辑:它确实能。如果需要流式传输,TextReader.ReadLine()也可以正确处理Unix行结尾符。
再次编辑:StreamReader也一样。你只是查看文档并假设它无法处理LF行结束符吗?我在Reflector中查看,它似乎是一个正确的处理程序。

文件实际上很大,我必须逐行阅读以进行后处理。 - Quan Mai
@Vimvq1987(四年后...)但是这如何解决了你的问题呢?换句话说,如果这个正确的话,那么你的代码之前失败是因为其他原因。出于好奇(如果你还记得的话),那是什么原因呢? - Marc L.

0

我本来猜LF (\n)应该没问题(而只有CR (\r)可能会有问题)。

您可以一次读取一个字符并在读取终止符时处理每行。

经过分析,如果速度太慢,则可以使用read([])的应用程序端缓冲。但是首先尝试简单的逐个字符处理!


有快速函数实现这个功能。首先尝试使用它们,因为它们快速、简短、表达清晰且标准化。 - Sam Harwell

0

或者您可以使用Readblock方法并自行解析行


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接