223

テキスト ファイル内の行数をプログラムで簡単に判断する方法はありますか?

4

11 に答える 11

425

大幅に遅れた編集: .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 は小さなファイルの場合は高速になる可能性がありますが、大きなファイルの場合は大幅に遅くなると思います。唯一の方法は、ストップウォッチまたはコード プロファイラーで測定することです。

于 2008-09-23T07:27:24.870 に答える
13

最も簡単:

int lines = File.ReadAllLines("myfile").Length;
于 2008-09-23T07:28:07.007 に答える
8

これによりメモリの使用量は少なくなりますが、おそらく時間がかかります

int count = 0;
string line;
TextReader reader = new StreamReader("file.txt");
while ((line = reader.ReadLine()) != null)
{
  count++;
}
reader.Close();
于 2008-09-23T07:33:14.527 に答える
5

簡単にというのは、解読は簡単だが非効率なコード行を意味するのでしょうか?

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);
}

他にもたくさんの方法がありますが、おそらく上記のいずれかを使用することになります。

于 2008-09-23T07:29:43.070 に答える
2

すぐにそれを読み込んでカウンターをインクリメントできます。ループを使用してインクリメントするだけで、テキストには何もしません。

于 2008-09-23T07:27:38.317 に答える
1

キャリッジリターン/ラインフィードを数えます。私はユニコードを信じていますが、それらはまだそれぞれ 0x000D と 0x000A です。そうすれば、効率的または非効率的にすることができ、両方のキャラクターを処理する必要があるかどうかを決定できます

于 2008-09-23T07:28:32.887 に答える
1

実行可能なオプションであり、私が個人的に使用したオプションは、ファイルの最初の行に独自のヘッダーを追加することです。これは、ゲームのカスタム モデル フォーマット用に行いました。基本的に、私は .obj ファイルを最適化し、不要なものを取り除き、より良いレイアウトに変換し、ライン、面、法線、頂点、およびテクスチャ UV の総数を書き込むツールを持っています。一番最初の行。そのデータは、モデルのロード時にさまざまな配列バッファーによって使用されます。

これは、ファイルを 1 回ループして読み込むだけでよく、行数を数えて作成したバッファーにデータを再度読み込む必要がなくなるため、便利です。

于 2016-05-20T00:25:45.550 に答える
0

これを使って:

    int get_lines(string file)
    {
        var lineCount = 0;
        using (var stream = new StreamReader(file))
        {
            while (stream.ReadLine() != null)
            {
                lineCount++;
            }
        }
        return lineCount;
    }
于 2020-08-09T14:24:18.203 に答える
-1
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);
}         
于 2012-10-07T14:18:05.863 に答える
-3

wc .exe」実行可能ファイル ( UnixUtilsに付属しており、インストールは必要ありません) を外部プロセスとして起動できます。さまざまな行カウント方法をサポートしています (unix、mac、windows など)。

于 2008-09-23T07:43:35.847 に答える