确定文本文件中的行数

时间:2020-03-06 14:35:03  来源:igfitidea点击:

有没有一种简便的方法可以以编程方式确定文本文件中的行数?

解决方案

严重迟来的编辑:如果我们使用的是.NET 4.0或者更高版本

File类具有新的ReadLines方法,该方法懒惰地枚举行,而不是贪婪地将它们全部读取到类似ReadAllLines的数组中。因此,我们现在可以同时拥有效率和简洁性:

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

原始答案

如果我们不太担心效率,可以简单地写:

var lineCount = File.ReadAllLines(@"C:\file.txt").Length;

对于更有效的方法,我们可以执行以下操作:

var lineCount = 0;
using (var reader = File.OpenText(@"C:\file.txt"))
{
    while (reader.ReadLine() != null)
    {
        lineCount++;
    }
}

编辑:回应有关效率的问题

我说第二个效率更高的原因是关于内存使用情况,不一定是速度。第一个将文件的全部内容加载到一个数组中,这意味着它必须分配至少与文件大小一样多的内存。第二个仅一次循环一行,因此它不必一次分配多于一行的内存。对于小文件来说,这并不是很重要,但是对于大文件来说,这可能是个问题(例如,如果我们尝试在32位系统上找到4GB文件中的行数,则根本不够用)用户模式地址空间来分配这么大的数组)。

在速度方面,我不希望其中有很多。 ReadAllLines可能在内部进行了一些优化,但另一方面,它可能不得不分配大量的内存。我猜想对于小文件,ReadAllLines可能会更快,但是对于大文件,ReadAllLines可能会慢得多。尽管唯一的方法是使用秒表或者代码分析器对其进行测量。

我们可以快速读入它,并增加一个计数器,只需使用循环来增加,而对文本不执行任何操作。

最简单的:

int lines = File.ReadAllLines("myfile").Length;

计算回车/换行符。我相信在unicode中它们分别仍然是0x000D和0x000A。这样,我们可以根据需要选择效率高低,并决定是否必须同时处理两个字符

如果简单地说,我们是说容易破译但效率低下的几行代码?

string[] lines = System.IO.File.RealAllLines($filename);
int cnt = lines.Count();

这可能是知道多少行的最快方法。

我们也可以这样做(取决于我们是否将其缓冲在其中)

#for large files
while (...reads into buffer){
string[] lines = Regex.Split(buffer,System.Enviorment.NewLine);
}

还有许多其他方法,但是以上可能之一是我们将要使用的方法。

这将使用较少的内存,但可能需要更长的时间

int count = 0;
string line;
TextReader reader = new StreamReader("file.txt");
while ((line = reader.ReadLine()) != null)
{
  count++;
}
reader.Close();

我们可以启动作为外部进程运行的" wc.exe"可执行文件(UnixUtils附带,不需要安装)。它支持不同的行数计算方法(如UNIX,Mac,Windows)。