| |
|
.NET TIPS
テキスト・ファイルの内容を読み込むには?[C#、VB]
デジタルアドバンテージ 遠藤 孝信
2003/06/13
2008/08/14 更新 |
 |
|
テキスト・ファイルの読み込みは、いまなおプログラミングにおける基本的な処理の1つである。
文字列への読み込み
テキスト・ファイルの内容を読み込むには、まずファイルを開き、次にその内容を読み込み、最後にファイルを閉じる処理が必要になる。
■ファイルを開く
ファイルを開くにはいくつかの書き方があるが、Windowsで最も一般的に使用されているシフトJISのファイルを、ファイル名を指定して開くにはStreamReaderクラス(System.IO名前空間)を次のようにして使用するのが最も簡便だ。
StreamReader sr = new StreamReader(
"readme.txt", Encoding.GetEncoding("Shift_JIS"));
|
Dim sr As New StreamReader( _
"readme.txt", Encoding.GetEncoding("Shift_JIS"))
|
|
| StreamReaderクラスによるファイルのオープン(上:C#、下:VB) |
StreamReaderクラスには多くのコンストラクタが用意されているが、ここでは開くファイルと、そのファイルのキャラクタ・セットに対応したEncodingクラス(System.Text名前空間)のオブジェクトを指定するバージョンを使用している。この場合には、シフトJISに対応したEncodingオブジェクトを使用しているため、ファイルの読み込み時にはその内容がシフトJIS文字列で構成されているものとして取り扱われる(Encodingクラスについては、「TIPS:文字列をシフトJISとしてバイト列に変換するには?」などで解説している)。
■ファイルを読み込む
続いてStreamReaderクラスのReadToEndメソッドを呼び出せば、ファイルの内容をすべて1つの文字列に読み込むことができる。次のサンプル・プログラムは、カレント・ディレクトリにあるシフトJISのファイル「readme.txt」を文字列に読み込み、それを画面に表示する。
// fread1.cs
using System;
using System.IO;
using System.Text;
class FileRead1 {
static void Main() {
StreamReader sr = new StreamReader(
"readme.txt", Encoding.GetEncoding("Shift_JIS"));
string text = sr.ReadToEnd();
sr.Close();
Console.Write(text);
}
}
// コンパイル方法:csc fread1.cs
|
|
| シフトJISのファイル「readme.txt」を読み込み表示するC#のサンプル・プログラム(fread1.cs) |
|
' fread1.vb
Imports System
Imports System.IO
Imports System.Text
Class FileRead1
Shared Sub Main()
Dim sr As New StreamReader( _
"readme.txt", Encoding.GetEncoding("Shift_JIS"))
Dim text As String = sr.ReadToEnd()
sr.Close()
Console.Write(text)
End Sub
End Class
' コンパイル方法:vbc fread1.vb
|
|
| シフトJISのファイル「readme.txt」を読み込み表示するVBのサンプル・プログラム(fread1.vb) |
|
ReadToEndメソッドでは、改行コードなども含めてすべての1つの文字列として読み込まれる。
usingステートメントによるファイルのクローズ
StreamReaderクラスで開いたファイルは、そのCloseメソッドにより閉じておく必要がある。Openメソッド(StreamReaderクラスにはない)などで明示的にオープン処理を呼び出していないのにもかかわらず、Closeメソッドを呼び出すのは少し不自然さを感じるかもしれない。
StreamReaderクラスはIDisposableインターフェイスを実装しているため(正確には親クラスのTextReaderクラスが実装している)、次のサンプル・プログラムのように、Closeメソッドを呼び出す代わりにusingステートメントを利用することもできる(IDisposableインターフェイスやusingステートメントに関しては「TIPS:確実な終了処理を行うには?」で解説している)。
// fread2.cs
using System;
using System.IO;
using System.Text;
class FileRead2 {
static void Main() {
string text = "";
using (StreamReader sr = new StreamReader(
"readme.txt", Encoding.GetEncoding("Shift_JIS"))) {
text = sr.ReadToEnd();
}
Console.Write(text);
}
}
// コンパイル方法:csc fread2.cs
|
|
| usingステートメントを使用しているC#のサンプル・プログラム(fread2.cs) |
|
' fread2.vb
Imports System
Imports System.IO
Imports System.Text
Class FileRead2
Shared Sub Main()
Dim text As String = ""
Using sr As New StreamReader( _
"readme.txt", Encoding.GetEncoding("Shift_JIS"))
text = sr.ReadToEnd()
End Using
Console.Write(text)
End Sub
End Class
' コンパイル方法:vbc fread2.vb
|
|
| usingステートメントを使用しているVBのサンプル・プログラム(fread2.vb) |
|
この場合には、usingステートメントの実行を終えたときに、自動的にStreamReaderクラスのDisposeメソッドが呼び出され、その中でCloseメソッドが呼び出されることになる。
ファイルが読み込めない場合のエラー処理
以上2つのサンプル・プログラムでは、開こうとするファイルが存在しない場合や、ファイルの読み取り中にディスクなどに何らかの障害が発生した場合には、例外が発生してプログラムの実行が中断してしまう。
実際のアプリケーションでは、このような例外発生時に備えて、次のような例外処理を記述しておく必要があるだろう。
// fread3.cs
using System;
using System.IO;
using System.Text;
class FileRead3 {
static void Main() {
string text = "";
try {
using (StreamReader sr = new StreamReader(
"readme.txt", Encoding.GetEncoding("Shift_JIS"))) {
text = sr.ReadToEnd();
}
Console.Write(text);
} catch (Exception e) {
Console.WriteLine(e.Message);
}
}
}
// コンパイル方法:csc fread3.cs
|
|
| ファイルが読めない場合に対応したC#のサンプル・プログラム(fread3.cs) |
|
' fread3.vb
Imports System
Imports System.IO
Imports System.Text
Class FileRead3
Shared Sub Main()
Dim text As String = ""
Try
Using sr As New StreamReader( _
"readme.txt", Encoding.GetEncoding("Shift_JIS"))
text = sr.ReadToEnd()
End Using
Console.Write(text)
Catch exception As Exception
Console.WriteLine(exception.Message)
End Try
End Sub
End Class
' コンパイル方法:vbc fread3.vb
|
|
| ファイルが読めない場合に対応したVBのサンプル・プログラム(fread3.vb) |
|
usingステートメントを使用していると、例外発生時にもファイルのクローズ処理が自動的に行われるため便利だ。
1行ずつの読み込み
処理によっては、ファイル全体を1つの文字列として読み込むよりも、1行ずつ読み込んで文字列の配列とした方が扱いやすい場合がある。ファイルから1行読み込むには、ReadLineメソッドを使用すればよい。ReadLineメソッドは、StreamReaderクラスによりオープンされたファイルから1行だけ読み取り、内部の読み取り位置を1行分進める。読み取り位置がファイルの最後に達した場合にはnull(VBの場合にはNothing)を返す。
次のサンプル・プログラムではファイルの行を読み込みながら、ArrayListクラス(System.Collections名前空間)のインスタンスに追加していき、そのあと各行を順に画面に表示する。
// fread4.cs
using System;
using System.IO;
using System.Text;
using System.Collections;
class FileRead4 {
static void Main() {
string line = "";
ArrayList al = new ArrayList();
using (StreamReader sr = new StreamReader(
"readme.txt", Encoding.GetEncoding("Shift_JIS"))) {
while ((line = sr.ReadLine()) != null) {
al.Add(line);
}
}
for (int i = 0; i < al.Count; i++) {
Console.WriteLine(al[i]);
}
}
}
// コンパイル方法:csc fread4.cs
|
|
| シフトJISのファイル「readme.txt」を1行ずつ読み込み表示するC#のサンプル・プログラム(fread4.cs) |
|
' fread4.vb
Imports System
Imports System.IO
Imports System.Text
Imports System.Collections
Class FileRead4
Shared Sub Main()
Dim line As String = ""
Dim al As New ArrayList
Using sr As StreamReader = New StreamReader( _
"readme.txt", Encoding.GetEncoding("Shift_JIS"))
line = sr.ReadLine()
Do Until line Is Nothing
al.Add(line)
line = sr.ReadLine()
Loop
End Using
For i As Integer = 0 To al.Count - 1
Console.WriteLine(al.Item(i))
Next i
End Sub
End Class
' コンパイル方法:vbc fread4.vb
|
|
| シフトJISのファイル「readme.txt」を1行ずつ読み込み表示するVBのサンプル・プログラム(fread4.vb) |
|
ArrayListクラスは可変長の配列として利用することができる。テキスト・ファイルは1度全体を読み込んでみなければ、全体の行数は分からない。このため、宣言時にその要素数を指定しなければならない通常の配列は、このような場合には適当ではないだろう。ArrayListクラスについては「TIPS:配列のサイズを変更するには?」で解説している。なお、読み込んだ各行には改行コードは含まれない。
なお、.NET Framework 2.0では、ファイルを開き、内容を読み込み、閉じるという一連の処理を1つのメソッド呼び出しで可能とするReadAllTextメソッドとReadAllLinesメソッドがFileクラス(System.IO名前空間)に追加されている。これについては「TIPS:テキスト・ファイルの内容を簡単に読み込むには?」で解説している。
| 更新履歴 |
| 【2008/08/14】VB(Visual Basic)のコード例とサンプル・プログラムを追加しました。 |
|
|
|
generated by
|
|
TechTargetジャパン
キャリアアップ