在环顾四周时,我发现了很多关于如何计算文件中行数的讨论。
例如这三个:
c# 如何计算
文本文件中的行数 确定文本文件中的行
数 如何快速计算行数?
所以,我继续前进并最终使用了我能找到的最有效(至少在记忆方面?)的方法:
private static int countFileLines(string filePath)
{
using (StreamReader r = new StreamReader(filePath))
{
int i = 0;
while (r.ReadLine() != null)
{
i++;
}
return i;
}
}
但是当文件中的行本身很长时,这需要很长时间。真的没有更快的解决方案吗?
我一直在尝试使用StreamReader.Read()
,StreamReader.Peek()
但我不能(或不知道如何)让它们中的任何一个在有“东西”(字符?文本?)时立即进入下一行。
请问有什么想法吗?
结论/结果(根据提供的答案运行一些测试后):
我在两个不同的文件上测试了下面的 5 种方法,我得到了一致的结果,这似乎表明普通旧StreamReader.ReadLine()
方法仍然是最快的方法之一......老实说,在答案中的所有评论和讨论之后,我感到困惑。
文件 #1:
大小:3,631 KB
行数:56,870
文件 #1 的结果以秒为单位:
0.02 --> ReadLine 方法。
0.04 --> 读取方法。
0.29 --> ReadByte 方法。
0.25 --> Readlines.Count 方法。
0.04 --> ReadWithBufferSize 方法。
文件 #2:
大小:14,499 KB
行数:213,424
文件 #1 的结果以秒为单位:
0.08 --> ReadLine 方法。
0.19 --> 读取方法。
1.15 --> ReadByte 方法。
1.02 --> Readlines.Count 方法。
0.08 --> ReadWithBufferSize 方法。
以下是我根据收到的所有反馈测试的 5 种方法:
private static int countWithReadLine(string filePath)
{
using (StreamReader r = new StreamReader(filePath))
{
int i = 0;
while (r.ReadLine() != null)
{
i++;
}
return i;
}
}
private static int countWithRead(string filePath)
{
using (StreamReader _reader = new StreamReader(filePath))
{
int c = 0, count = 0;
while ((c = _reader.Read()) != -1)
{
if (c == 10)
{
count++;
}
}
return count;
}
}
private static int countWithReadByte(string filePath)
{
using (Stream s = new FileStream(filePath, FileMode.Open))
{
int i = 0;
int b;
b = s.ReadByte();
while (b >= 0)
{
if (b == 10)
{
i++;
}
b = s.ReadByte();
}
return i;
}
}
private static int countWithReadLinesCount(string filePath)
{
return File.ReadLines(filePath).Count();
}
private static int countWithReadAndBufferSize(string filePath)
{
int bufferSize = 512;
using (Stream s = new FileStream(filePath, FileMode.Open))
{
int i = 0;
byte[] b = new byte[bufferSize];
int n = 0;
n = s.Read(b, 0, bufferSize);
while (n > 0)
{
i += countByteLines(b, n);
n = s.Read(b, 0, bufferSize);
}
return i;
}
}
private static int countByteLines(byte[] b, int n)
{
int i = 0;
for (int j = 0; j < n; j++)
{
if (b[j] == 10)
{
i++;
}
}
return i;
}