各行をループすることなくファイルの行数を決定する方法はMatlabにありますか?
明らかに、fgetlまたは同様の関数を使用してファイルをループし、カウンターをインクリメントできますが、ファイルの行数を判別する方法はありますかなしこのようなループを実行していますか?
私はまさにこの仕事のために次のコードを使いたいです
_fid = fopen('someTextFile.txt', 'rb');
%# Get file size.
fseek(fid, 0, 'eof');
fileSize = ftell(fid);
frewind(fid);
%# Read the whole file.
data = fread(fid, fileSize, 'uint8');
%# Count number of line-feeds and increase by one.
numLines = sum(data == 10) + 1;
fclose(fid);
_
ファイル全体を一度に読み取るのに十分なメモリがある場合は、かなり高速です。 WindowsスタイルとLinuxスタイルの両方の行末で機能するはずです。
編集:これまでに提供された回答のパフォーマンスを測定しました。これは、100万のdouble値(1行に1つの値)を含むテキストファイルの行数を決定した結果です。平均10回の試行。
_ Author Mean time +- standard deviation (s)
------------------------------------------------------
Rody Oldenhuis 0.3189 +- 0.0314
Edric (2) 0.3282 +- 0.0248
Mehrwolf 0.4075 +- 0.0178
Jonas 1.0813 +- 0.0665
Edric (1) 26.8825 +- 0.6790
_
Perlを使用してすべてのファイルをバイナリデータとして読み取る方法が最も高速です。 Perlが1行ずつループするのではなく、ファイルの大きなブロックを内部で一度に読み取る場合でも、驚かないでしょう(ほんの推測で、Perlについては何も知りません)。
単純なfgetl()
- loopを使用すると、他のアプローチよりも25〜75倍遅くなります。
編集2: Edricの2番目のアプローチが含まれています。これはmuchより速く、Perlソリューションと同等です、と私は言います。
私はループが実際に最高だと思います-これまでに提案された他のすべてのオプションは、外部プログラムに依存する(エラーチェックが必要、str2numが必要、クロスプラットフォームのデバッグ/実行が難しいなど)、またはファイル全体を一度に読み取る。ループはそれほど悪くありません。これが私の変種です
function count = countLines(fname)
fh = fopen(fname, 'rt');
assert(fh ~= -1, 'Could not read: %s', fname);
x = onCleanup(@() fclose(fh));
count = 0;
while ischar(fgetl(fh))
count = count + 1;
end
end
編集:ジョナスは上記のループが本当に遅いことを正しく指摘しています。これはより高速なバージョンです。
function count = countLines(fname)
fh = fopen(fname, 'rt');
assert(fh ~= -1, 'Could not read: %s', fname);
x = onCleanup(@() fclose(fh));
count = 0;
while ~feof(fh)
count = count + sum( fread( fh, 16384, 'char' ) == char(10) );
end
end
それでもwc -l
ほど高速ではありませんが、災害でもありません。
私は素敵なトリックを見つけました ここ :
if (isunix) %# Linux, mac
[status, result] = system( ['wc -l ', 'your_file'] );
numlines = str2num(result);
elseif (ispc) %# Windows
numlines = str2num( Perl('countlines.pl', 'your_file') );
else
error('...');
end
どこ 'countlines.pl'
はPerlスクリプトで、以下を含みます
while (<>) {};
print $.,"\n";
ファイル全体を一度に読み取ることができ、読み取った行数をカウントできます。
fid = fopen('yourFile.ext');
allText = textscan(fid,'%s','delimiter','\n');
numberOfLines = length(allText{1});
fclose(fid)
これには外部ツールを使用することをお勧めします。たとえば、cloc
というアプリをダウンロードできます ここ は無料でダウンロードできます。
Linuxでは、単にcloc <repository path>
と入力して取得します
YourPC$ cloc <directory_path>
87 text files.
81 unique files.
23 files ignored.
http://cloc.sourceforge.net v 1.60 T=0.19 s (311.7 files/s, 51946.9 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
MATLAB 59 1009 1074 4993
HTML 1 0 0 23
-------------------------------------------------------------------------------
SUM: 60 1009 1074 5016
-------------------------------------------------------------------------------
彼らはまたそれが窓で働くべきであると主張します。