C#でテキストファイルを読み込む

C#でテキストファイルを読み込むには System.IO.StreamReader クラスを使います。

ここでは基本的な StreamReader クラスの使い方についてまとめてみます。

ファイルを開く

StreamReaderオブジェクトを生成すると、ファイルがオープンされて内容を読み込める状態になります。

 

読み込みたいファイルの名前はコンストラクタの引数に渡します。

ファイルの文字エンコーディングも合わせてコンストラクタの引数に渡しましょう。

 

※文字コード

テキストファイルに書かれる文字は文字コードと呼ばれるバイト表現と文字の対応表を使って保存されています。

保存時に使った文字コードと同じ文字コードで解釈して読み込まなければ漢字などが正しく読み込めない事があります。

    var fileName = @"c:\test.txt";
    var encoding = System.Text.Encoding.GetEncoding("SHIFT_JIS");

    var reader = new System.IO.StreamReader(fileName, encoding);

ファイルを読む

StreamReader クラスの ReadLine() メソッドを使うと1行ずつ読み込んでいくことが出来ます。

 

ファイルの終わりに達したかどうかは EndOfStream プロパティで確認出来るので、EndOfStream が true になるまでループしてあげる事でファイルの最後まで読み込む事ができます。

            var fileName = @"c:\test.txt";
            var encoding = System.Text.Encoding.GetEncoding("SHIFT_JIS");

            var reader = new System.IO.StreamReader(fileName, encoding);
            while (!reader.EndOfStream)
            {
                var record = reader.ReadLine();

                //読み込んだ行にたいする処理
            }

ファイルを閉じる

ファイルは開いたら必ず閉じる必要があります。

ファイルを閉じるには StreamReader クラスの Close() メソッドを呼び出します。

Close は finally で

ファイルの読み込み中に例外が発生する可能性がある事を必ず考慮してコードを書きましょう。

try ... finally ステートメントの finally ブロックで Close() を呼び出す事で例外発生時にも対応したコードを書くことが出来ます。

    var fileName = @"c:\test.txt";
    var encoding = System.Text.Encoding.GetEncoding("SHIFT_JIS");

    var reader = new System.IO.StreamReader(fileName, encoding);
    try
    {
        while (!reader.EndOfStream)
        {
        var record = reader.ReadLine();

        //読み込んだ行にたいする処理
        }
    }
    finally
    {
        reader.Close();
    }

Close の代わりに using を使う

StreamReader クラスは IDisposable インターフェースをもっているので、Close() メソッドのかわりに using 構文を使う事も出来ます。

 

下記の例は、上の try … finally を使ったコードと全く同じ動きをします。

using ブロックを抜けた時点で(例外が起きる起きないにかかわらず)IDispposableインターフェースの Dispose() メソッドが呼ばれます。この Dispose() でファイルを閉じる処理が行われます。

    var fileName = @"c:\test.txt";
    var encoding = System.Text.Encoding.GetEncoding("SHIFT_JIS");

    using (var reader = new System.IO.StreamReader(fileName, encoding))
    {
        while (!reader.EndOfStream)
        {
        var record = reader.ReadLine();

        //読み込んだ行にたいする処理
        }
    }