C#
 Computer >> コンピューター >  >> プログラミング >> C#

【C#入門】テキストファイルを1行ずつ読み込む最速の方法|StreamReader・File.ReadLines・ReadAllLinesの違いを解説

C#でテキストファイルを1行ずつ読み込む方法は複数あり、代表的なものとしてStreamReader.ReadLineFile.ReadLinesFile.ReadAllLinesなどが挙げられます。それぞれの特徴やパフォーマンスの違いを理解しておくことで、用途に応じた最適な実装が可能になります。

ここでは、ローカルマシンに以下のような内容のテキストファイル(D:\Demo\Demo.txt)が存在する場合を例に、各方法を見ていきましょう。

Hi All!!
Hello Everyone!!
How are you?

StreamReader.ReadLineを使う方法

C#のStreamReaderは、指定したエンコーディングでストリームから文字を読み取るためのクラスです。StreamReaderクラスはTextReaderクラスを継承しており、文字単位、ブロック単位、行単位、あるいはファイル全体の内容を読み取るためのメソッドを提供しています。

ReadLineメソッドをwhileループと組み合わせることで、ファイルを先頭から順に1行ずつ効率的に処理できます。usingステートメントでリソースを確実に解放している点もポイントです。

サンプルコード

using System;
using System.IO;
using System.Text;

namespace DemoApplication{
    public class Program{
        static void Main(string[] args){
            using (var fileStream = File.OpenRead(@"D:\Demo\Demo.txt"))
            using (var streamReader = new StreamReader(fileStream, Encoding.UTF8)){
                String line;
                while ((line = streamReader.ReadLine()) != null){
                    Console.WriteLine(line);
                }
            }
            Console.ReadLine();
        }
    }
}

出力結果

Hi All!!
Hello Everyone!!
How are you?

File.ReadLinesを使う方法

File.ReadLines()メソッドは、テキストファイルを開き、すべての行をIEnumerable<string>として遅延評価で返します。ファイルの内容を一度にメモリへ読み込むのではなく、列挙されるたびに行を順次読み込むため、大きなファイルでもメモリ消費を抑えられるのが大きなメリットです。foreachループと組み合わせて使うのが一般的です。

サンプルコード

using System;
using System.IO;

namespace DemoApplication{
    public class Program{
        static void Main(string[] args){
            var lines = File.ReadLines(@"D:\Demo\Demo.txt");
            foreach (var line in lines){
                Console.WriteLine(line);
            }
            Console.ReadLine();
        }
    }
}

出力結果

Hi All!!
Hello Everyone!!
How are you?

File.ReadAllLinesを使う方法

File.ReadAllLines()メソッドは、ReadLinesとよく似ていますが、戻り値がIEnumerable<string>ではなくstring[]配列である点が異なります。そのため、読み込んだ後にインデックスを指定して任意の行へランダムアクセスできるという利点があります。一方で、ファイルの全行をまとめてメモリに読み込むため、巨大なファイルを扱う場合はメモリ使用量に注意が必要です。

サンプルコード

using System;
using System.IO;

namespace DemoApplication{
    public class Program{
        static void Main(string[] args){
            var lines = File.ReadAllLines(@"D:\Demo\Demo.txt");
            for (var i = 0; i < lines.Length; i += 1){
                var line = lines[i];
                Console.WriteLine(line);
            }
            Console.ReadLine();
        }
    }
}

出力結果

Hi All!!
Hello Everyone!!
How are you?

どの方法を選ぶべき?パフォーマンスの目安

3つの方法はいずれも正しく動作しますが、最適な選択は状況によって異なります。

  • StreamReader.ReadLine: エンコーディングの指定や細かい制御が必要な場合、また極めて大きなファイルを扱う場合に有効です。ストリームを直接操作するため柔軟性が高い反面、コード量はやや多くなります。
  • File.ReadLines: 巨大なファイルを1行ずつ順番に処理したい場合に最適です。遅延評価によりメモリ効率が良く、コードも簡潔に書けます。多くの場面で推奨される方法です。
  • File.ReadAllLines: ファイルサイズが小〜中規模で、読み込んだ後に行へのランダムアクセスや複数回の走査が必要な場合に便利です。

純粋な読み込み速度だけを比べると、内部的にはFile.ReadLinesもStreamReaderを利用して実装されているため、大きな差は生まれません。重要なのは「メモリ効率」と「コードの簡潔さ」のバランスであり、一般的にはFile.ReadLinesが最もバランスの取れた選択肢と言えるでしょう。

  1. ステガノグラフィの要件とは?隠蔽通信に必要な6つの条件を解説

    ステガノグラフィ(Steganography)とは、データを他の情報の中に隠すことで、「通信が行われている」という事実そのものを秘匿する技術です。さまざまなキャリアファイル構造が利用できますが、コンピュータネットワーク上で頻繁にやり取りされることから、デジタル画像が特に重要な媒体とされています。画像に機密データを隠すためのステガノグラフィ手法は非常に多数存在し、その難易度はさまざまで、それぞれに固有の長所と短所があります。また、ステガノグラフィ手法には、用途に応じて複数の要件が求められます。たとえば、隠された情報の完全な不可視性を必要とするソフトウェアもあれば、より大きな秘密メッセージを隠せる

  2. DESのバリエーションとは?Double DESとTriple DESの違いを徹底解説

    DESのバリエーションとは? データ暗号化標準(DES)には、主に以下の2つのバリエーションがあります。 Double DES(ダブルDES) Triple DES(トリプルDES) Double DES(ダブルDES)の仕組み Double DESは、同じ平文に対して2段階のDES処理を適用する暗号化方式です。各段階では異なる鍵を使用して平文を暗号化し、復号時には両方の鍵が必要になります。 64ビットの平文は、まず最初のDESインスタンスに入力され、1つ目の鍵を使って64ビットの中間テキストへと変換されます。続いて、この中間テキストが2番目のDESインスタンスに入力され、2つ目の鍵によ