我必须逐行读取日志文件。它的大小约为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;
}
答案 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方法并自行解析行