2017-08-11 65 views
1

我正在开发此代码,用户选择一个目录后,它将显示包含在该位置的文件的表格及其详细信息(名称,类型,大小...)。如何获取文本文件中的行数而不打开它?

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

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

上面的代码按预期方式工作,它给我我想要的东西,但它可能如果在所选择的目录中的文件太多了沉重的过程!

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

问候!

+7

超自然力量。 –

+0

简答题:不。 –

+1

你必须打开它。计算出来的轻量级解决方案是将第一个字符读入缓冲区,对其进行计数,然后切换到下一行,直到没有更多行。 –

回答

4

不能读取文件中的行数。您的代码运行的操作系统不会将行数存储为某种元数据。他们甚至不会区分二进制和文本文件!你只需要读取文件并计算换行符。

但是,如果文件中有大量行,则可能会比现在做得更快。

这行代码是什么,我很担心:

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引擎应该做优化的好工作这段代码。

根据您想要解释该文件的方式,您可能还需要根据文件是否以换行结束而略微调整最终计数。但是不要在循环中这样做,之后再做。

1

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

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

+0

对于alert()的抱歉。我相信你在NodeJS之类的服务器端做这件事。我只是在浏览器上尝试。 – LordSidious

相关问题