2017-08-11 2 views
1

私はこのコードを開発しています。ユーザーがディレクトリを選択すると、その場所に含まれるファイルのテーブル(名前、タイプ、サイズなど)が表示されます。テキストファイルを開くことなく行数を取得する方法は?

ディレクトリには多くのファイルが含まれている可能性があります。

私はそれを達成することに成功しました。しかし、私の問題は、各ファイルの行数を表示したいということです。予想通り

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; 

上記のコードの仕事、それは私が欲しいものを私に与えるが、選択したディレクトリにあるので、多くのファイルがある場合、それは重い処理の可能性があります。私はこのJavaScriptコードを使用して行数を取得することができます!

質問:テキストファイルの行数を読み取らずに取得する方法はありますか?

よろしくお願いいたします。

+7

超常態力。 –

+0

短い回答:いいえ –

+1

これを開く必要があります。それを理解するための軽量の解決策は、最初の文字をバッファに読み込み、それを数え、次に行がなくなるまで次の行に移動することです。 –

答えて

4

ファイル内の行数を読み取ることはできません。コードが実行されるオペレーティングシステムは、行数を何らかの種類のメタデータとして保存しません。彼らはバイナリファイルとテキストファイルを一般に区別しません!ファイルを読み、改行を数えればいいだけです。

ただし、ファイルの行数が多い場合は、これよりも高速に処理できます。

このコード行は、私が心配するものである:ここsplitを呼び出す

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

は、メモリ割り当ての数が多い、ファイルの各行に1つずつ作成します。

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

これは、任意のメモリの割り当てなしで改行文字をカウントし、ほとんどのJavaScriptエンジンが最適化の良い仕事をする必要があります。

私の勘では、forループで直接改行をカウントするために速くなるだろうということですこのコード。

ファイルの改行の終了の有無に応じて、ファイルの解釈方法に応じて最終的なカウントを微調整することもできます。しかし、ループの中でそれをしないでください。

1

文書を開くことなく行数を知る方法はありません。あなたが持っているパフォーマンスの問題に関しては、おそらく.split()から来るでしょう。 ファイルをメモリ内の文字列としてロードし、このファイルに行数と同じ数の文字列を生成しています。 ファイルは、コードの1000行結果のRAM使用量が 1文字列(全ファイル) 千の文字列(行につき1列)

になりますが含まれている場合、私は正規表現を用いた評価のためにこれをchaging推薦します。ここに例があります

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

ファイルによっては別の正規表現が必要な場合があります。 これは確かにパフォーマンスを向上させます。

+0

アラート()のごめんなさい。私はあなたがNodeJSのようなものでこのサーバー側をやっていると確信しています。私はブラウザでこれを試していました。 – LordSidious

関連する問題