如何获取文本文件中的行数而不打开它?
我正在开发此代码,用户选择一个目录后,它将显示包含在该位置的文件的表格及其详细信息(名称,类型,大小...)。如何获取文本文件中的行数而不打开它?
一个目录可能包含很多文件。
我成功地实现了这一点。但是,我的问题是我想显示每个文件中的行数。我可以用这个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;
上面的代码按预期方式工作,它给我我想要的东西,但它可能如果在所选择的目录中的文件太多了沉重的过程!
问题:有没有办法在不阅读文本文件的情况下获取行数?
问候!
不能读取文件中的行数。您的代码运行的操作系统不会将行数存储为某种元数据。他们甚至不会区分二进制和文本文件!你只需要读取文件并计算换行符。
但是,如果文件中有大量行,则可能会比现在做得更快。
这行代码是什么,我很担心:
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引擎应该做优化的好工作这段代码。
根据您想要解释该文件的方式,您可能还需要根据文件是否以换行结束而略微调整最终计数。但是不要在循环中这样做,之后再做。
没有办法知道没有打开文档的行数。关于你遇到的性能问题最可能来自.split()。 您正在将该文件作为字符串加载到内存中,然后生成与此文件中的行数相同的字符串。 如果文件包含1000行代码导致内存占用会 1字符串(整个文件) 1000字符串(每行1串)
我会建议换款本作使用正则表达式的一个评价。这里有一个例子
var file = ("this\nis a string\n with new\nlines");
var match = file.match(/\r?\n/g);
alert(match.length);
请记住,根据您的文件可能需要不同的正则表达式。 这肯定会提高性能。
对于alert()的抱歉。我相信你在NodeJS之类的服务器端做这件事。我只是在浏览器上尝试。 – LordSidious
超自然力量。 –
简答题:不。 –
你必须打开它。计算出来的轻量级解决方案是将第一个字符读入缓冲区,对其进行计数,然后切换到下一行,直到没有更多行。 –