如何在不打开文本文件的情况下获取文本文件中的行数?

How to get the number of lines in a text file without opening it?

我正在开发这段代码,在用户选择目录后,它会显示 table 包含在该位置的文件及其详细信息(名称、类型、大小 ...)。

一个目录可能包含很多文件。

我成功地做到了。但是,我的问题是我想显示每个文件中的行数。我可以使用此 JavaScript 代码获取行数:

var reader = new FileReader();
var textFile = $("#file").get(0).files[0];
reader.readAsText(textFile);
$(reader).on('load', processFile);
/*And in processFile() i use this line to get the number of lines :*/
nbLines = (file.split("\n")).length;

上面的代码按预期工作,它给了我想要的东西,但如果所选目录中有这么多文件,它可能是一个繁重的过程!

问题:有没有办法在不读取文本文件的情况下获取行数?

此致!

不打开文档是无法知道行数的。关于您遇到的性能问题,最有可能来自 .split() 。 您将文件作为字符串加载到内存中,然后生成与此文件中的行一样多的字符串。 如果一个文件包含 1000 行代码,则生成的 ram 使用量将是 1 个字符串(整个文件) 1000 个字符串(每行 1 个字符串)

我建议使用 RegEx 对此进行评估。这是一个例子

var file = ("this\nis a string\n with new\nlines");
var match = file.match(/\r?\n/g);
alert(match.length);

请记住,根据您的文件,可能需要不同的正则表达式。 这肯定会提高性能。

如果不阅读文件,就无法计算文件中的行数。您的代码运行的操作系统不会将行数存储为某种元数据。他们甚至一般都不区分二进制文件和文本文件!你只需要阅读文件并计算换行符。

但是,如果您的文件有很多行,您可能会比现在更快地执行此操作。

这行代码是我担心的:

nbLines = (file.split("\n")).length;

在这里调用split会创建大量内存分配,文件中的每一行一个。

我的直觉是直接在 for 循环中计算换行符会更快:

function lineCount( text ) {
    var nLines = 0;
    for( var i = 0, n = text.length;  i < n;  ++i ) {
        if( text[i] === '\n' ) {
            ++nLines;
        }
    }
    return nLines;
}

这计算了没有任何内存分配的换行符,大多数 JavaScript 引擎应该能很好地优化这段代码。

您可能还想根据文件是否以换行符结尾来稍微调整最终计数,具体取决于您想要如何解释它。但是不要在循环中这样做,然后再做。

2021 年更新:

以文本形式读取文件总是一个坏主意。目前优化过的语言,几乎所有的语言在处理循环时都是超快的,所以循环总是比将文本加载到内存中并拆分要快。

对于 NodeJS,请参阅 ReadLine. Although not recommended to do such operations in node, being Single Threaded, I can read Big CSVs pretty fast using ReadLine

文本文件通常在屏幕底部包含一条操作线,允许您将光标放在屏幕上并显示它所在的字符的行和位置。在这种情况下,如果光标位于最后一个字符,则会指示总行数。