小窓
テキストファイル処理 [VB.NET]

作成日:2022/4/15

ダイアログ表示

ファイルを開くダイアログ

ファイルを開くダイアログボックス(OpenFileDialog)の基本形のサンプル。

Dim ofd As New OpenFileDialog() ' OpenFileDialogクラスのインスタンス作成

ofd.FileName = "default.html" ' 「ファイル名(デフォルト)」を指定

ofd.InitialDirectory = "C:\" ' 「フォルダ(デフォルト)」を指定。

ofd.Filter = "HTMLファイル(*.html;*.htm)|*.html;*.htm|すべてのファイル(*.*)|*.*" ' [ファイルの種類]の選択肢指定

ofd.FilterIndex = 1 ' [ファイルの種類]の初期選択値

ofd.Title = "開くファイルの選択。" ' タイトル

' 「ofd.ShowDialog()」のコードを記述することでダイアログが表示される。
' もし、下記のようなコードを記述すると、この時点でダイアログが表示される。
' dim Result = ofd.ShowDialog()
If ofd.ShowDialog() = DialogResult.OK Then
  ' OKボタンがクリックされたとき、ここの処理が実行される。
  ' 「ofd.FileName」に、選択されたファイルのフルパスが入っている。
End If

ここに指定するプロパティの詳細を記述する。

名前をつけて保存ダイアログ

名前をつけて保存ダイアログダイアログボックス(OpenFileDialog)の基本形のサンプル。

Dim sfd As New SaveFileDialog() ' SaveFileDialogクラスのインスタンスを作成

sfd.FileName = "保存ファイル.html" ' はじめに「ファイル名」で表示される文字列を指定する

sfd.InitialDirectory = "C:\" ' はじめに表示されるフォルダを指定する

sfd.Filter = "HTMLファイル(*.html;*.htm)|*.html;*.htm|すべてのファイル(*.*)|*.*" ' [ファイルの種類]の選択肢指定

sfd.FilterIndex = 1 ' [ファイルの種類]の初期選択値

sfd.Title = "保存先ディレクトリ選択。" ' タイトル

' 「sfd.ShowDialog()」のコードを記述することでダイアログが表示される。
' もし、下記のようなコードを記述すると、この時点でダイアログが表示される。
' dim Result = sfd.ShowDialog()
If sfd.ShowDialog() = DialogResult.OK Then ' ダイアログを表示する
  ' OKボタンがクリックされたとき、ここの処理が実行される。
End If

ここに指定するプロパティの詳細を記述する。

ファイルの読み書き

ファイル入出力処理の場合、作業の終了後のDispose忘れを防止するために、 全てusingステートメントを使用したサンプルを記載している。

また、このサンプルを実行して確認する場合を考慮して、書き出しサンプル→読み込みサンプルの順で記載している。

1行ずつ処理する

1行ずつ書き込む

基本形サンプル。

Dim ary() As String = {"a01", "a02", "a03"} ' 書き出しデータ

' パラメータ値の設定
Dim parmPath As String = "D:\test.txt"
Dim parmAppend As Boolean = False
Dim parmEncode As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
Using writer As New System.IO.StreamWriter(parmPath, parmAppend, parmEncode)
' 配列(ary())を1行ずつ書き出す
For Each line As String In ary
writer.WriteLine(line)
Next
writer.Close() ' 不要だが記述しても良い。
End Using

• Dim ary() As String = {"a01", "a02", "a03"} ' 書き出しデータ
このサンプルでは、ファイルに書き出すデータを配列で持っている。
• ' パラメータ値の設定
ここでは、StreamWriterに与えるパラメータを、事前に変数にセットしている。
もちろん、変数を経由せずStreamWriter呼び出し時に、直接コーディングしても構わない。
  • ∘ Dim parmPath As String = "D:\test.txt"
  • ∘ Dim parmAppend As Boolean = False
  • ∘ Dim parmEncode As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
• Using writer As New System.IO.StreamWriter(parmPath, parmAppend, parmEncode)
Usingステートメントを使用して、StreamWriterを変数「writer」にセットしている。
StreamWriter呼び出し時のパラメータの説明。
∘ 第1パラメータ:ファイル名(必須)
書き出すファイルのパスを指定する。
存在しないファイルを指定した場合は、ファイルを新規作成した後に、そのファイルに書き出す。
ファイルが存在した場合(既存ファイルの場合)、第2パラメータの指示に従って書き出す。
∘ 第2パラメータ:追加書き(Append)指定(省略値=False)
第1パラメータで指定したファイルが既存ファイルの場合の、追加書き(Append)に関する指定。
= True:追加書きする。
= False:追加書きしない。つまり、既存ファイル内のデータを無視して先頭から新しいデータを書き出す。
∘ 第3パラメータ:エンコーディング(省略値=BOM無しUTF-8)
System.Text.Encoding.GetEncodingメソッド呼び出し時のパラメータ。
= Shift_Jis:日本語シフトJIS(shift-jis,x-sjis,sjis,MS_kanjiでも可)
= UTF-8:BOMありUTF-8
その他多数あり。
BOMなしUTF-8について
第3パラメータで「BOMなしUTF-8」を指定することはできない。
「BOMなしUTF-8」でファイルを書き出す必要のある場合は、第3パラメータの指定を省略する。
(省略すると「BOMなしUTF-8」で書き出すことができる。)
「BOMなしUTF-8」でファイルを書き出す際に重要なことは、 ファイル内のデータに全角文字が存在しないときは「BOMなしUTF-8」ではなく、 「Shift-Jis」で書き出されてしまうことだ。
「BOMなしUTF-8」で出力したい場合は、必要がない場合でも工夫して(例えばコメントを挿入するなど)全角文字を1文字でも出力しなければならない。
' 配列(ary())を1行ずつ書き出す
「writer.WriteLine(line)」でレコードを1件書き出す。
WriteLineで書き出すと自動的に末尾に改行文字列が挿入される。 改行文字列は、NewLineプロパティで指定されている文字列(デフォルトで、「キャリッジリターン+ラインフィード」)になる。
これを「Foe Each」で必要分繰り返す。
writer.Close() ' 不要だが記述しても良い。
Usingを使用していないときはここ(書き出し処理の完了時点)でリソースを開放する。
しかし、Usingを使用している場合は、Usingブロックを抜けるときに開放されていないリソースを開放してくれるので必要はない。
これは禁止されているわけではない。必要であればClose(Dispose)を発行すれば良い。
End Using
Usingブロックの最後を宣言する。

1行ずつ読み込む

基本形サンプル。

' パラメータ値の設定
Dim parmPath As String = "D:\test.txt"
Dim parmEncode As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
Using reader As New System.IO.StreamReader(parmPath, parmEncode)
' 1行ずつ読み込む
Do Until reader.EndOfStream
Debug.WriteLine(reader.ReadLine())
Loop
reader.Close() ' 不要だが記述しても良い。
End Using

• ' パラメータ値の設定
ここでは、StreamReaderに与えるパラメータを、事前に変数にセットしている。
もちろん、変数を経由せずStreamReader呼び出し時に、直接コーディングしても構わない。
  • ∘ Dim parmPath As String = "D:\test.txt"
  • ∘ Dim parmEncode As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
• Using reader As New System.IO.StreamReader(parmPath, parmEncode)
Usingステートメントを使用して、StreamReaderを変数「reader」にセットしている。
StreamReader呼び出し時のパラメータの説明。
∘ 第1パラメータ:ファイル名(必須)
読み込むファイルのパスを指定する。
∘ 第2パラメータ:エンコーディング(省略値=UTF-8)
System.Text.Encoding.GetEncodingメソッド呼び出し時のパラメータ。
= Shift_Jis:日本語シフトJIS(shift-jis,x-sjis,sjis,MS_kanjiでも可)
その他多数あり。
' 1行ずつ読み込む
「ReadLine()」メソッドでレコードを1件読み込む。
これを、入力ファイルの終了(.EndOfStream)まで繰り返す(Do Until)。
なおReadLineメソッドが返す文字列には末尾の改行記号(キャリッジリターン、ラインフィード)は含まれない。 ReadLineメソッドはファイルを最後まで読み込むとNothing(null)を返すので、これで末尾を判断することもでるが、 ここではWhileステートメント
このサンプルでは
Do Until reader.EndOfStream
  Debug.WriteLine(reader.ReadLine())
Loop

のループで、ReadLineメソッドを繰り返しているが、MicrosoftDocsを含め殆どのサイトで
While reader.Peek() > -1
  Debug.WriteLine(reader.ReadLine())
End While

のループを使用したReadLineメソッドの繰り返しを紹介している。

「.EndOfStream」は、その名称通りストリーム(入力ファイル)の終了を判定していることがわかる。

「.peek()」の戻り値を検索してみると、
  • 読み取り対象の次の文字を表す整数。
  • 読み取り対象の文字が存在しない場合またはストリームがシークをサポートしていない場合は -1。
と書いてある。
「読み取り対象の文字が存在しない場合」が「ストリーム(入力ファイル)の終了」だけを意味するのかは若干疑問だが、
どちらも入力ファイルの最初から最後までの読み込み処理を実行してくれそうだ。
reader.Close() ' 不要だが記述しても良い。
Usingを使用していないときはここ(読み込み処理の完了時点)でリソースを開放する。
しかし、Usingを使用している場合は、Usingブロックを抜けるときに開放されていないリソースを開放してくれるので必要はない。
これは禁止されているわけではない。必要であればClose(Dispose)を発行すれば良い。
End Using
Usingブロックの最後を宣言する。

ファイルのオープン

の基本形のサンプル。

ファイルを開くダイアログボックスを表示する。