gpt4 book ai didi

c# - StreamReader.Readline() 真的是计算文件行数最快的方法吗?

转载 作者:可可西里 更新时间:2023-11-01 08:04:27 28 4
gpt4 key购买 nike

环顾四周,我发现了很多关于如何计算文件行数的讨论。

例如这三个:
c# how do I count lines in a textfile
Determine the number of lines within a text file
How to count lines fast?

所以,我继续前进并最终使用了我能找到的似乎最有效(至少在内存方面?)的方法:

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;
}

最佳答案

不,不是。重点是 - 它具体化了不需要的字符串。

要计算它,您最好忽略“字符串”部分并转到“行”部分。

LINE 是一系列以\r\n (13, 10 - CR LF) 或其他标记结尾的字节。

只需在缓冲流中沿着字节运行,计算行尾标记的出现次数。

关于c# - StreamReader.Readline() 真的是计算文件行数最快的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14243249/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com