确定文本文件中的行数
有没有一种简便的方法可以以编程方式确定文本文件中的行数?
解决方案
严重迟来的编辑:如果我们使用的是.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)。