如何在不读取文件的情况下获取文件中的行数

4

可能是重复问题:
如何快速计算行数?

我有一些包含逐行数据的文件。

我想要获取文件中的行数以向用户展示进度状态。(我逐行读取这些文件并在后台进行处理)

我可以通过完全读取文件来做到这一点,但这些文件非常大,因此我的应用程序会不必要地消耗RAM空间。

因此,我想要在不完全读取整个文件的情况下获取文件中的行数。

我该怎么做?


4
https://dev59.com/FW025IYBdhLWcg3wST6Q - illegal-immigrant
我想问一下,你需要知道行数吗?如果是为了进度条,我会根据字节数来计算。 - chrispepper1989
5个回答

8
  1. 读取文件的大小(以字节为单位)-- 操作系统会告诉你这个。
  2. 读取前1000行(并处理它们)。
  3. 计算平均行大小。
  4. 将这个平均大小除以文件大小。
  5. 现在你有了一个估计文件中行数的数字,足够准确,可以用于进度条显示之类的东西。
  6. 如果这还不够准确,在读取文件时每隔一段时间重新计算一次。

谢谢您的回答。这是我问题的最佳解决方案。 - Uğur Aldanmaz
对于进度条,我发现以下代码足够准确: long fileSize = new FileInfo(dataPath).Length; bytesProcessed += line.Length; progress = fileSize/bytesProcessed (假设line是一个字符串) - chrispepper1989

7
显然你不可能。获取行数的唯一方式是计算文件中的换行符,并且您需要读取文件才能获得这些信息。

我可以完全读取文件来做到这一点。但是这些文件非常大。因此,我的应用程序会不必要地消耗内存。

您可以部分读取文件(以便每个部分足够小,以适合内存),并从每个小部分累积行数。

谢谢您的回答。我已经将此设置为后台进程,但我需要向用户显示状态。例如:文件处理:100/10000。 - Uğur Aldanmaz
请注意,对于“部分读取文件”,您可以将其作为流进行读取,因此无需读取整个文件。 - bryanmac
不,我正在进行中部分读取文件 :) - Uğur Aldanmaz

5
var lineCount = File.ReadLines(@"C:\file.txt").Count();

1
@zerkms,你说这是不可能做到的。(对于那个答案加一分)。虽然这不是回答问题(“不加载到内存”),但仍然是一种很好的计算行数的方法。 - Kaf
1
@zerkms 是的,我明白你的意思。我同意你的观点。我的意思是这是一种“快速”计算行数的方法,当然它会加载文件。 - Kaf
3
尽管这个答案“reads”整个文件,但它并不会将所有内容加载到内存中。ReadLines返回IEnumerable<string> - L.B
1
@zerkms 正如您所说,它不会存储任何东西。 - L.B
1
@L.B:感谢您提供事实。我也错了,同意了@zerkms的观点。 - Kaf
显示剩余5条评论

0

另一种可能性,但这仅适用于您还负责生成数据文件的应用程序开发的情况,是让它创建两个文件。一个包含数据,另一个仅包含数据文件的行数。然后,当您准备处理数据文件时,您的处理应用程序可以从行计数文件中读取行计数,然后开始处理数据文件。

如果您无法访问数据生成应用程序,请忽略此答案,因为它不适用于您的问题。


0

无法精确计算文本文件的行数(但可以根据前n行猜测),而不需要将其读入内存中(您不需要一次性读取整个文件,可以逐行读取,例如使用ReadLine,这不会消耗太多RAM)。还可以查看类似问题

long count = 0;
using (StreamReader r = new StreamReader(f))
{
    string line;
    while ((line = r.ReadLine()) != null)
    {
        count++;
    }
}

return count;

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