如何在不打开文本文件的情况下获取文本文件中的行数?
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。
文本文件通常在屏幕底部包含一条操作线,允许您将光标放在屏幕上并显示它所在的字符的行和位置。在这种情况下,如果光标位于最后一个字符,则会指示总行数。
我正在开发这段代码,在用户选择目录后,它会显示 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。
文本文件通常在屏幕底部包含一条操作线,允许您将光标放在屏幕上并显示它所在的字符的行和位置。在这种情况下,如果光标位于最后一个字符,则会指示总行数。