テキスト ファイル内の行数をプログラムで簡単に判断する方法はありますか?
11 に答える
大幅に遅れた編集: .NET 4.0 以降を使用している場合
このFile
クラスには、 のReadLines
ように貪欲にすべての行を配列に読み込むのではなく、行を怠惰に列挙する新しいメソッドがありますReadAllLines
。したがって、次の方法で効率と簡潔さの両方を実現できます。
var lineCount = File.ReadLines(@"C:\file.txt").Count();
元の回答
効率についてあまり気にしない場合は、次のように簡単に書くことができます。
var lineCount = File.ReadAllLines(@"C:\file.txt").Length;
より効率的な方法として、次のことができます。
var lineCount = 0;
using (var reader = File.OpenText(@"C:\file.txt"))
{
while (reader.ReadLine() != null)
{
lineCount++;
}
}
編集:効率に関する質問への回答
2 番目の方が効率的であると言った理由は、必ずしも速度ではなく、メモリ使用量に関するものでした。最初のものは、ファイルの内容全体を配列にロードします。つまり、少なくともファイルのサイズと同じ量のメモリを割り当てる必要があります。2 つ目は、一度に 1 行ずつループするだけなので、一度に複数の行に相当するメモリを割り当てる必要はありません。これは小さなファイルではそれほど重要ではありませんが、大きなファイルでは問題になる可能性があります (たとえば、32 ビット システムで 4GB ファイルの行数を調べようとすると、十分な行数がない場合など)。ユーザー モードのアドレス空間を使用して、このサイズの配列を割り当てます)。
速度に関しては、私はそれに多くがあるとは思わない. ReadAllLines にいくつかの内部最適化がある可能性はありますが、一方で、大量のメモリ チャンクを割り当てる必要がある場合があります。ReadAllLines は小さなファイルの場合は高速になる可能性がありますが、大きなファイルの場合は大幅に遅くなると思います。唯一の方法は、ストップウォッチまたはコード プロファイラーで測定することです。
最も簡単:
int lines = File.ReadAllLines("myfile").Length;
これによりメモリの使用量は少なくなりますが、おそらく時間がかかります
int count = 0;
string line;
TextReader reader = new StreamReader("file.txt");
while ((line = reader.ReadLine()) != null)
{
count++;
}
reader.Close();
簡単にというのは、解読は簡単だが非効率なコード行を意味するのでしょうか?
string[] lines = System.IO.File.RealAllLines($filename);
int cnt = lines.Count();
これはおそらく、行数を知る最も簡単な方法です。
あなたもすることができます(あなたがそれをバッファリングしているかどうかに応じて)
#for large files
while (...reads into buffer){
string[] lines = Regex.Split(buffer,System.Enviorment.NewLine);
}
他にもたくさんの方法がありますが、おそらく上記のいずれかを使用することになります。
すぐにそれを読み込んでカウンターをインクリメントできます。ループを使用してインクリメントするだけで、テキストには何もしません。
キャリッジリターン/ラインフィードを数えます。私はユニコードを信じていますが、それらはまだそれぞれ 0x000D と 0x000A です。そうすれば、効率的または非効率的にすることができ、両方のキャラクターを処理する必要があるかどうかを決定できます
実行可能なオプションであり、私が個人的に使用したオプションは、ファイルの最初の行に独自のヘッダーを追加することです。これは、ゲームのカスタム モデル フォーマット用に行いました。基本的に、私は .obj ファイルを最適化し、不要なものを取り除き、より良いレイアウトに変換し、ライン、面、法線、頂点、およびテクスチャ UV の総数を書き込むツールを持っています。一番最初の行。そのデータは、モデルのロード時にさまざまな配列バッファーによって使用されます。
これは、ファイルを 1 回ループして読み込むだけでよく、行数を数えて作成したバッファーにデータを再度読み込む必要がなくなるため、便利です。
これを使って:
int get_lines(string file)
{
var lineCount = 0;
using (var stream = new StreamReader(file))
{
while (stream.ReadLine() != null)
{
lineCount++;
}
}
return lineCount;
}
try {
string path = args[0];
FileStream fh = new FileStream(path, FileMode.Open, FileAccess.Read);
int i;
string s = "";
while ((i = fh.ReadByte()) != -1)
s = s + (char)i;
//its for reading number of paragraphs
int count = 0;
for (int j = 0; j < s.Length - 1; j++) {
if (s.Substring(j, 1) == "\n")
count++;
}
Console.WriteLine("The total searches were :" + count);
fh.Close();
} catch(Exception ex) {
Console.WriteLine(ex.Message);
}