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

DOBON.NET

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

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

StreamReaderクラスを用いてテキストファイルの内容を読み込む簡単な例を示します。次の例ではテキストファイル"C:\test.txt"をReadToEndメソッドで一度にすべて読み込んでいます。ここではテキストファイルをShift JISコードとして読み込んでいます。

[VB.NET]
'"C:\test.txt"をShift-JISコードとして開く
Dim sr As New System.IO.StreamReader("C:\test.txt", _
    System.Text.Encoding.GetEncoding(932))
'内容をすべて読み込む
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(932));
//内容をすべて読み込む
string s = sr.ReadToEnd();
//閉じる
sr.Close();

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

補足:StreamReaderはFileShare.Readとしてファイルを開くようです。よって、StreamReaderで開いているファイルは、別のプロセスからは読み込みは可能でも、書き込みはできません。またバッファのサイズは4096(0x1000)バイトとなるようです。

補足:.NET Framework 2.0以降のVB.NETでは、My.Computer.FileSystem.OpenTextFileReaderメソッドで同じことができます。

文字コードの指定

ここで Encoding についてちょっと説明しておきましょう。上記の例ではShift JISのEncodingを「932」というコードページで指定していますが、「shift_jis」のように名前で指定することも出来ます。

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

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

文字コード コードページ コードの名前
日本語 シフトJIS 932 shift_jis(または、「shift-jis」や「x-sjis」など)
日本語 EUC 51932 euc-jp
日本語 JIS 50220 iso-2022-jp
日本語 JIS(1バイトカタカナ可) 50221 csISO2022JP
日本語 JIS(1バイトカタカナ可 - SO/SI) 50222 iso-2022-jp
UTF-8 65001 utf-8

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

補足:日本語 シフトJISはプラットフォームに依存するため、サポートされていない可能性もあります(Windows 98の米国版など)。サポートされていない場合は、エラーとなります。

Encodingを指定しない時はUTF-8として読み込まれます。

一行ずつ読み込む

次に一行ずつ読み込む例を示します。前の例と同様、Shift-JISのテキストファイル"C:\test.txt"を一行ずつ読み込んでその内容を出力しています。ReadLineメソッドで一行読み込み、Peekメソッドで末尾を確認しています。なおReadLineメソッドが返す文字列には、末尾の改行記号が含まれません。

[VB.NET]
'"C:\test.txt"をShift-JISコードとして開く
Dim sr As New System.IO.StreamReader("C:\test.txt", _
    System.Text.Encoding.GetEncoding(932))
'内容を一行ずつ読み込む
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(932));
//内容を一行ずつ読み込む
while (sr.Peek() > -1)
{
    Console.WriteLine(sr.ReadLine());
}
//閉じる
sr.Close();

補足:Peekの代わりに、ReadLineがnull(VB.NETではNothing)を返した時に最後まで読んだと判断することもできます。

一文字ずつ読み込む

Readメソッドにより、一文字ずつ読み込むことができます。Readメソッドは整数を返し、最後まで読み込むと-1を返します。よって、文字として取得するためには、Convert.ToCharなどでChar型に変換する必要があります。

[VB.NET]
'"C:\test.txt"をShift-JISコードとして開く
Dim sr As New System.IO.StreamReader( _
    "C:\test.txt", System.Text.Encoding.GetEncoding(932))
'内容を一文字ずつ読み込む
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(932));
//内容を一文字ずつ読み込む
while (sr.Peek() > -1)
{
    Console.Write(Convert.ToChar(sr.Read()));
}
//閉じる
sr.Close();

補足:Peekの代わりに、Readが-1を返した時に最後まで読んだと判断することもできます。

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

Readメソッドでは、指定した文字数だけ読み込むこともできます。10文字ずつ読み込む例を以下に示します。

[VB.NET]
'"C:\test.txt"をShift-JISコードとして開く
Dim sr As New System.IO.StreamReader( _
    "C:\test.txt", System.Text.Encoding.GetEncoding(932))
'内容を10文字ずつ読み込む
While sr.Peek() > -1
    Dim c(9) As Char
    sr.Read(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(932));
//内容を10文字ずつ読み込む
while (sr.Peek() > -1)
{
    char[] c = new char[10];
    sr.Read(c, 0, c.Length);
    Console.Write(c);
}
//閉じる
sr.Close();

補足:Peekの代わりに、Readが0を返した時に最後まで読んだと判断することもできます。

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

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

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

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

'テキストファイルの中身をすべて読み込む
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(932);

//テキストファイルの中身をすべて読み込む
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メソッドに関する記述を追加。

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

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。