.NET TIPS

テキスト・ファイルの内容を簡単かつ効率的に読み込むには?[4以降、C#、VB]

デジタルアドバンテージ 遠藤 孝信
2010/05/13

 「TIPS:テキスト・ファイルの内容を簡単に読み込むには?」では、Fileクラス(System.IO名前空間)のReadAllLinesメソッドにより、テキスト・ファイルの内容を配列に読み込む方法を紹介しているが、このメソッドは全行を1度に読み込むため、巨大なテキスト・ファイルでは呼び出し時に時間がかかる。

 このため、先頭から1行ずつ処理したいような場合には、「TIPS:テキスト・ファイルの内容を読み込むには?」の後半で紹介しているように、StreamReaderクラス(System.IO名前空間)などを使用する必要があった。

FileクラスのReadLinesメソッド

 .NET Framework 4では、Fileクラスに新しくReadLinesメソッドが追加されている。

 このメソッドも、引数に指定したテキスト・ファイルを1行ずつ読み込むためのものだが、メソッドの呼び出し時にはファイルを読み込まない。代わりに列挙子オブジェクトを返し、その列挙時(反復処理時)に1行ずつ読み込むため、行単位の作業を効率よく記述できる。

 以下にReadLinesメソッドの記述例を示す。これは、テキスト・ファイルを1行ずつ読み込み、それを画面に表示する。

// readlines.cs

using System;
using System.IO;
using System.Collections.Generic;

class Program {
  static void Main() {

    string fileName = @"c:\tmp\readme.txt";

    IEnumerable<string> lines = File.ReadLines(fileName);

    foreach (string line in lines) {
      Console.WriteLine(line);
    }
  }
}

// コンパイル方法:csc readlines.cs
' readlines.vb

Imports System
Imports System.IO
Imports System.Collections.Generic

Class Program
  Shared Sub Main()

    Dim fileName As String = "c:\tmp\readme.txt"

    Dim lines As IEnumerable(Of String) = File.ReadLines(fileName)

    For Each line In lines
      Console.WriteLine(line)
    Next

  End Sub
End Class

' コンパイル方法:vbc readlines.vb
ReadLinesメソッドを使用したサンプル・プログラム(上:C#、下:VB)

 このように、ReadLinesメソッドの戻り値はIEnumerable<string>クラス(VBではIEnumerable(Of String)と記述)*のオブジェクトとなる。このため、実際に各行を読み込むためには、foreach文(VBではFor Each文)を使用することになる(あるいはLINQのデータソースとして利用できる)。

* System.Collections.Generic名前空間のジェネリック・クラスである、IEnumerable<T>クラス(VBではIEnumerable(Of T)と記述)をString型に適用したクラス。

 UTF-8以外の文字コードのファイルを使用する場合には、ReadLinesメソッドの第2引数で、ファイルの文字コードに該当するEncodingオブジェクト(System.Text名前空間)を指定する。

 次のサンプル・プログラムではシフトJISのファイルを処理している。

// readlines2.cs

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

class Program {
  static void Main() {

    string fileName = @"c:\tmp\readme.txt"; // シフトJISファイル
    Encoding SJIS = Encoding.GetEncoding("Shift_JIS");

    foreach (string line in File.ReadLines(fileName, SJIS)) {
      Console.WriteLine(line);
    }
  }
}

// コンパイル方法:csc readlines2.cs
' readlines2.vb

Imports System
Imports System.IO
Imports System.Text

Class Program
  Shared Sub Main()

    Dim fileName As String = "c:\tmp\readme.txt" ' シフトJISファイル
    Dim SJIS As Encoding = Encoding.GetEncoding("Shift_JIS")

    For Each line In File.ReadLines(fileName, SJIS)
      Console.WriteLine(line)
    Next

  End Sub
End Class

' コンパイル方法:vbc readlines2.vb
ReadLinesメソッドによるシフトJISファイルの読み込み(上:C#、下:VB)

 こちらのサンプル・プログラムでは、ReadLinesメソッド呼び出しをforeach文(For Each文)に埋め込んでいる。このため列挙子オブジェクトを明示的には宣言していない。End of Article

利用可能バージョン:.NET Framework 4以降
カテゴリ:クラス・ライブラリ 処理対象:テキスト・ファイル
使用ライブラリ:Fileクラス(System.IO名前空間
使用ライブラリ:StreamReaderクラス(System.IO名前空間)
使用ライブラリ:IEnumerable<T>クラス(System.Collections.Generic名前空間)
関連TIPS:テキスト・ファイルの内容を簡単に読み込むには?
関連TIPS:テキスト・ファイルの内容を読み込むには?

この記事と関連性の高い別の.NET TIPS
テキスト・ファイルの内容を簡単に読み込むには?
ファイルやディレクトリの一覧を効率的に取得するには?
テキスト・ファイルの内容を読み込むには?
ファイルにテキストを書き込むには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」

TechTargetジャパン

Insider.NET フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH