DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

文字コードを指定してテキストファイルを読み込む

ここでは、テキストファイルの内容を文字列として読み込む方法について説明します。

ストリームを使ってテキストファイルを読み込む

最も基本的な方法は、StreamReaderクラスを使う方法です。

早速ですが、以下にStreamReaderクラスを用いてテキストファイルの内容を読み込む簡単な例を示します。この例ではテキストファイル"C:\test.txt"をReadToEndメソッドですべて読み込んでいます。

VB.NET
コードを隠すコードを選択
'"C:\test.txt"をShift-JISコードとして開く
Dim sr As New System.IO.StreamReader("C:\test.txt", _
    System.Text.Encoding.GetEncoding("shift_jis"))
'内容をすべて読み込む
Dim s As String =  sr.ReadToEnd() 
'閉じる
sr.Close()
 
'結果を出力する
Console.WriteLine(s)
C#
コードを隠すコードを選択
//"C:\test.txt"をShift-JISコードとして開く
System.IO.StreamReader sr = new System.IO.StreamReader(
    @"C:\test.txt",
    System.Text.Encoding.GetEncoding("shift_jis"));
//内容をすべて読み込む
string s = sr.ReadToEnd();
//閉じる
sr.Close();

//結果を出力する
Console.WriteLine(s);

StreamReaderは使用後にCloseメソッドを使って閉じる必要があります。通常は、usingステートメントやtry...finallyを使って確実にCloseメソッドが呼び出されるようにします。詳しくは、「Dispose、Closeが確実に呼び出されるようにする」をご覧ください。

補足:StreamReaderはFileShare.Readとしてファイルを開きます。よって、StreamReaderで開いているファイルは、別のプロセス(あるいは自分のプロセス)からの読み込みは可能ですが、書き込みはできません。この設定を変更する方法は、「ファイルをロック(アクセスを制限)する」で紹介します。
補足:.NET Framework 2.0以降のVB.NETでは、My.Computer.FileSystem.OpenTextFileReaderメソッドを使ってStreamReaderオブジェクトを作成することもできます。また、UTF-8で開くのであれば、File.OpenTextメソッドを使うこともできます。

文字コードの指定

Encoding.GetEncodingメソッドについて説明します。Encoding.GetEncodingメソッドは指定されたエンコーディングのEncodingオブジェクトを返します。上記の例では、文字コードをShift JISとしてファイルを開いたことになります。

上記の例ではShift JISのEncodingを"shift_jis"というコードページ名で指定していますが、コードページIDである「932」で指定することも出来ます。

VB.NET
コードを隠すコードを選択
'"C:\test.txt"をShift-JISコードとして開く
Dim sr As New System.IO.StreamReader("C:\test.txt", _
    System.Text.Encoding.GetEncoding(932))
C#
コードを隠すコードを選択
//"C:\test.txt"をShift-JISコードとして開く
System.IO.StreamReader sr = new System.IO.StreamReader(
    @"C:\test.txt",
    System.Text.Encoding.GetEncoding(932));

その他の文字コードを指定する場合も同様にコードページIDかコードページ名を指定します。主な文字コードのコードページIDとコードページ名を以下に示します。

文字コード コードページID コードページ名 補足
日本語 シフトJIS 932 shift_jis(その他、「shift-jis」、「x-sjis」など) OSが日本語環境の時は、Encoding.Defaultプロパティや、GetEncoding(0)で取得できる
プラットフォームに依存
日本語 EUC 51932 euc-jp
日本語 JIS 50220 iso-2022-jp
日本語 JIS(1バイトカタカナ可)(CP50221) 50221 csISO2022JP
日本語 JIS(1バイトカタカナ可 - SO/SI)(CP50222) 50222
日本語 (Mac) 10001 x-mac-japanese プラットフォームに依存
IBM EBCDIC (日本語カタカナ) 20290 IBM290 プラットフォームに依存
日本語 (JIS 0208-1990 および 0212-1990) 20932 プラットフォームに依存
US-ASCII 20127 us-ascii 通常は、Encoding.ASCIIプロパティを使う
UTF-7 65000 utf-7 通常は、Encoding.UTF7プロパティを使う
UTF-8 65001 utf-8 通常は、Encoding.UTF8プロパティを使う
Unicode 1200 utf-16 通常は、Encoding.Unicodeプロパティを使う
Unicode (ビッグ エンディアン) 1201 unicodeFFFE 通常は、Encoding.BigEndianUnicodeプロパティを使う
UTF32 12000 utf-32 通常は、Encoding.UTF32プロパティを使う

これ以外の文字コードに関しては、「Encoding クラス」や「Code Page Identifiers」をご覧ください。

補足:コードページ名は大文字と小文字を区別しないようです。
補足:日本語 シフトJISなどはプラットフォームに依存するため、サポートされていない可能性もあります(Windows 98の米国版など)。サポートされていない場合は、エラーになります。

なおStreamReaderのコンストラクタでEncodingを指定しなかった時はUTF-8として読み込まれます。

一行ずつ読み込む

先の例では1度にすべて読み込みましたが、今度は一行ずつ読み込む例を示します。ReadLineメソッドで一行読み込み、Peekメソッドで末尾を確認します。ReadLineメソッドはファイルを最後まで読み込むとnull(VB.NETではNothing)を返しますので、これで末尾を判断することもできます。

なおReadLineメソッドが返す文字列には末尾の改行記号(キャリッジリターン、ラインフィード)が含まれませんので注意してください。

VB.NET
コードを隠すコードを選択
'"C:\test.txt"をShift-JISコードとして開く
Dim sr As New System.IO.StreamReader("C:\test.txt", _
    System.Text.Encoding.GetEncoding("shift_jis"))
'内容を一行ずつ読み込む
While sr.Peek() > -1
    Console.WriteLine(sr.ReadLine())
End While
'閉じる
sr.Close()
C#
コードを隠すコードを選択
//"C:\test.txt"をShift-JISコードとして開く
System.IO.StreamReader sr = new System.IO.StreamReader(
    @"C:\test.txt",
    System.Text.Encoding.GetEncoding("shift_jis"));
//内容を一行ずつ読み込む
while (sr.Peek() > -1)
{
    Console.WriteLine(sr.ReadLine());
}
//閉じる
sr.Close();

一文字ずつ読み込む

Readメソッドにより、一文字ずつ読み込むこともできます。Readメソッドは整数を返し、最後まで読み込むと-1を返します。この整数を文字に変換するには、Convert.ToCharメソッドなどを使用します。

VB.NET
コードを隠すコードを選択
'"C:\test.txt"をShift-JISコードとして開く
Dim sr As New System.IO.StreamReader( _
    "C:\test.txt", System.Text.Encoding.GetEncoding("shift_jis"))
'内容を一文字ずつ読み込む
While sr.Peek() > -1
    Console.Write(Convert.ToChar(sr.Read()))
End While
'閉じる
sr.Close()
C#
コードを隠すコードを選択
//"C:\test.txt"をShift-JISコードとして開く
System.IO.StreamReader sr = new System.IO.StreamReader(
    @"C:\test.txt",
    System.Text.Encoding.GetEncoding("shift_jis"));
//内容を一文字ずつ読み込む
while (sr.Peek() > -1)
{
    Console.Write(Convert.ToChar(sr.Read()));
}
//閉じる
sr.Close();

指定した文字数ずつ読み込む

ReadBlockメソッドを使って、指定した文字数だけ読み込むこともできます。ReadBlockメソッドは読み込んだ文字数を返し、ファイルの末尾に達していると、0を返します。

10文字ずつ読み込む例を以下に示します。

VB.NET
コードを隠すコードを選択
'"C:\test.txt"をShift-JISコードとして開く
Dim sr As New System.IO.StreamReader( _
    "C:\test.txt", System.Text.Encoding.GetEncoding("shift_jis"))
'内容を10文字ずつ読み込む
While sr.Peek() > -1
    Dim c(9) As Char
    sr.ReadBlock(c, 0, c.Length)
    Console.Write(c)
End While
'閉じる
sr.Close()
C#
コードを隠すコードを選択
//"C:\test.txt"をShift-JISコードとして開く
System.IO.StreamReader sr = new System.IO.StreamReader(
    @"C:\test.txt",
    System.Text.Encoding.GetEncoding("shift_jis"));
//内容を10文字ずつ読み込む
while (sr.Peek() > -1)
{
    char[] c = new char[10];
    sr.ReadBlock(c, 0, c.Length);
    Console.Write(c);
}
//閉じる
sr.Close();
補足:ReadBlockメソッドとほぼ同じメソッドにStreamReader.Readメソッドがあります。両者の違いは、Readメソッドが、ファイルの末尾に到達しなかったとしても、ストリーム内に使用できるデータがなかった場合、指定された文字数よりも少ない文字しか読み込まない可能性があるのに対して、ReadBlockメソッドは指定された文字数が読み込まれるまでループする(ブロックする)ことで、必ず指定された文字数読み込まれるようにします。しかし実際にStreamReader.Readメソッドが指定された文字数未満しか読み込まないことがあるのかは不明です。

.NET Framework 2.0以降で、ストリームを使わずに簡単に読み込む

.NET Framework 2.0からは、File.ReadAllTextメソッドReadAllLinesメソッドにより、指定したファイルの中身を指定した文字コードですべて読み込むことができます。ReadAllTextはファイルの中身すべてをStringに読み込みます。ReadAllLinesも同じくすべてを読み込みますが、行で分割されたString配列に読み込みます。

これらのメソッドは例外が発生しても確実にファイルを閉じるため、安心です。テキストファイルからすべての文字列を読み込むだけならば、StreamReader.ReadToEndメソッドよりも圧倒的に便利です。

以下にReadAllTextとReadAllLinesメソッドを使った例を示します。

VB.NET
コードを隠すコードを選択
'読み込むテキストファイル
Dim textFile As String = "C:\text.txt"
'文字コード(ここでは、Shift JIS)
Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("shift_jis")

'テキストファイルの中身をすべて読み込む
Dim str As String = System.IO.File.ReadAllText(textFile, enc)

'行ごとの配列として、テキストファイルの中身をすべて読み込む
Dim lines As String() = System.IO.File.ReadAllLines(textFile, enc)
C#
コードを隠すコードを選択
//読み込むテキストファイル
string textFile = "C:\\text.txt";
//文字コード(ここでは、Shift JIS)
System.Text.Encoding enc = System.Text.Encoding.GetEncoding("shift_jis");

//テキストファイルの中身をすべて読み込む
string str = System.IO.File.ReadAllText(textFile, enc);

//行ごとの配列として、テキストファイルの中身をすべて読み込む
string[] lines = System.IO.File.ReadAllLines(textFile, enc);
補足:.NET Framework 2.0以降のVB.NETでは、My.Computer.FileSystem.ReadAllTextメソッドでFile.ReadAllTextと同じことができます。
  • 履歴:
  • 2006/11/20 「一文字ずつ読み込む」「指定した文字数ずつ読み込む」を追加など。
  • 2007/1/25 File.ReadAllTextとReadAllLinesメソッドに関する記述を追加。
  • 2010/1/22 説明やコードの一部をより分かりやすいように書き換える。
  • 2010/9/9 Encodingに関する説明を補充。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。