如何读取仅由LF分隔的文件中的每一行?

时间:2009-07-17 08:35:34

标签: c# file streamreader

我必须逐行读取日志文件。它的大小约为6MB,总线数为40000。但在测试我的程序后,我发现该日志文件仅由LF字符分隔。所以我无法使用Readline

StreamReader方法

如何解决此问题?

编辑:我尝试使用文本阅读器,但我的程序仍无效:

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 个答案:

答案 0 :(得分:9)

TextReader.ReadLine已经处理了仅由\n终止的行。

来自the docs

  

一条线被定义为一系列   字符后跟一个马车   返回(0x000d),换行(0x000a),   回车后跟一条线   feed,New.NewLine,或者结束   流标记。字符串是   返回不包含   终止回车和/或   换行。返回的值是a   null引用(Visual中没有任何内容   基本)如果输入流结束   已经到达。

所以基本上,你应该没事。 (我已经谈过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)
{
    // ...
}

所有流媒体:)

答案 1 :(得分:3)

File.ReadAllLines(fileName)是否无法正确加载LF行结尾的文件?如果你需要整个文件,请使用它 - 我看到一个站点表明它比另一个方法慢,但是如果你将正确的编码传递给它(默认是UTF-8),那就不是了,加上它尽可能干净。

编辑:确实如此。如果您需要流式传输,TextReader.ReadLine()也可以正确处理Unix行结束。

再次编辑:StreamReader也是如此。你刚刚查看文档并假设它不会处理LF线端吗?我正在寻找Reflector,它确实看起来像是一个正确的处理程序。

答案 2 :(得分:0)

我已经猜到了\ LF(\ n)会好的(而\ CR(\ r)) - 只会导致问题。

您可以一次读取每行一个字符,并在读取终结符时对其进行处理。

分析后,如果这个太慢,那么你可以使用带有read([])的app-side-buffering。但首先尝试简单的角色!

答案 3 :(得分:0)

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