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

新手上路,请多包涵

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

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

我成功地做到了这一点。但是,我的问题是我想显示每个文件中的行数。我可以使用此 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;

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

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

问候!

原文由 Hamza Abdaoui 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 441
2 个回答

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

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

这行代码是我担心的:

 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 引擎应该能很好地优化这段代码。

根据您想要解释的方式,您可能还想根据文件是否以换行符结尾来稍微调整最终计数。但是不要在循环内这样做,然后再做。

原文由 Michael Geary 发布,翻译遵循 CC BY-SA 3.0 许可协议

不打开文档就无法知道行数。关于您遇到的性能问题,最有可能来自 .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);

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

原文由 LordSidious 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题