どうも!リョクちゃです。
今回は複数のテキストファイルを読み込み、
1つのテキストファイルを作成する方法を紹介していきます。
ここでは、以下の点について学びながら最終的ゴールである、
1つのファイルを作り上げていきます。
- 複数のファイルを読み込む方法
- 複数のファイルの内容を書き込む
- 1つのファイルを作成(これについてはテキストファイル関連記事もご覧ください。)
ちなみに前回は、こちら
目次
準備編:フォームを作成
最初に準備として、下のようなフォームを作成します。
コントロールは、
- ラベル
- リッチテキストボックス
- ボタン
- テキストボックス
を使用しています。
ちなみに筆者の環境は、
- VisualStudio2019
- Windows 10 64bit
- .Net Framework 4.5.2
です。
適当なフォルダを作成し、テキストファイルを作成
任意の場所にフォルダを作成し、その中にテキストファイルを3~4つ作成しましょう。
筆者は、以下のフォルダを作成し、テキストファイルを作成しました。
テキストファイルの中身はそれぞれ
sample_1.txt
sample_2.txt
sample_3.txt
sample_4.txt
を用意しました。(よければ同じのを作成してみてください。)
複数のテキストファイルを読み込む
それでは先ほど作成もしくは適当に用意したテキストファイルを読み取っていきます。
複数のファイルを読み取るには、考え方を少し変えます。
まず、1つのファイルを読み取るには、
を使うということは以前の記事でも触れました。
実は今回もこれを使います……。
ただ、このままでは複数のファイルは読み取ることができません。
どうすればよいか……。
ここで考え方を整理します。
複数のファイルはもともとは一つのファイルで存在します。
つまり、フォルダ内にある一つ一つのファイルを取得し、配列やリストといった
コレクション型の変数に格納してやります。
そうすることで、あとはFor文やWhile文を回すことで
あたかも複数のファイルを読み取っているような処理が実現できます。
複数のファイルを取得する
複数のファイルを取得するには、
を使います。
コードは下のようになります。
1 2 3 4 5 6 7 8 |
Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) ' 配列変数filesを作成し、これにフォルダ内のファイルをそれぞれ代入 Dim files As String() = System.IO.Directory.GetFiles("C:\Users\ryoku\Desktop\AryTextFile") End Sub End Class |
System.IO.Directory.GetFiles()は戻り値があるメソッドなので、
変数を作成し代入する書き方をしています。
変数filesの中身をフォーム上に表示してみる
それでは、変数filesの中身をリッチテキストボックスに表示していきましょう。
コードは下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 配列変数filesを作成し、これにフォルダ内のファイルをそれぞれ代入 Dim files As String() = System.IO.Directory.GetFiles("C:\Users\ryoku\Desktop\AryTextFile") For Each file As String In files ' 1つずつのファイルについて処理を行う ' リッチテキストボックスにファイル名を表示 Me.RichTextBox1.Text += file + vbCrLf Next file End Sub End Class |
これを実行すると、
このようになりますが、ちょっと見づらいですね。
なので、ファイルの名前だけを表示してあげるように直します。
ファイルのパスからファイル名と拡張子を取得するには、
を使用します。
コードは下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 配列変数filesを作成し、これにフォルダ内のファイルをそれぞれ代入 Dim files As String() = System.IO.Directory.GetFiles("C:\Users\ryoku\Desktop\AryTextFile") For Each file As String In files ' 1つずつのファイルについて処理を行う ' リッチテキストボックスにファイル名を表示 Me.RichTextBox1.Text += System.IO.Path.GetFileName(file) + vbCrLf Next file End Sub End Class |
これを実行すると、
見やすくなりました。
ファイルを読取り、内容を変数に代入
1つ1つに処理ができるようになったので、ファイルを読取り、
内容を配列やリストのコレクション型変数を作成し代入していきます。
コードは下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 配列変数filesを作成し、これにフォルダ内のファイルをそれぞれ代入 Dim files As String() = System.IO.Directory.GetFiles("C:\Users\ryoku\Desktop\AryTextFile") ' 事前に内容を書き込む変数を作成 Dim text As New System.Text.StringBuilder ' 事前にファイルを読み取る変数を作成 Dim sr As System.IO.StreamReader = Nothing For Each file As String In files ' 1つずつのファイルについて処理を行う ' リッチテキストボックスにファイル名を表示 Me.RichTextBox1.Text += System.IO.Path.GetFileName(file) + vbCrLf ' ファイルを読み取る準備 sr = New System.IO.StreamReader(file) ' ファイルの内容を最後まで読み取る While sr.Peek >= 0 text.Append(sr.ReadLine + vbCrLf) End While Next file End Sub End Class |
読み取った内容をもとに新たにファイルを作成する
それでは読み取った内容をもとにファイルを作成します。
ファイルを作成するには、
を使います。
今回、文字コードはUTF-8にします。
コードは下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 配列変数filesを作成し、これにフォルダ内のファイルをそれぞれ代入 Dim files As String() = System.IO.Directory.GetFiles("C:\Users\ryoku\Desktop\AryTextFile") ' 事前に内容を書き込む変数を作成 Dim text As New System.Text.StringBuilder ' 事前にファイルを読み取る変数を作成 Dim sr As System.IO.StreamReader = Nothing For Each file As String In files ' 1つずつのファイルについて処理を行う ' リッチテキストボックスにファイル名を表示 Me.RichTextBox1.Text += System.IO.Path.GetFileName(file) + vbCrLf ' ファイルを読み取る準備 sr = New System.IO.StreamReader(file) ' ファイルの内容を最後まで読み取る While sr.Peek >= 0 text.Append(sr.ReadLine + vbCrLf) End While Next file ' 新たなファイルを作成する準備をする Dim sw As System.IO.StreamWriter ' 文字コードを設定 Dim utf As System.Text.Encoding = System.Text.Encoding.UTF8 ' 新たに作成する場所を設定 Dim newFile As String = "./FusionText.txt" ' インスタンスを作成 sw = New System.IO.StreamWriter(newFile, True, utf) ' ファイルを作成 sw.Write(text.ToString) ' オブジェクトの解放 sw.Close() sw.Dispose() sw = Nothing GC.Collect() End Sub End Class |
最後にオブジェクトの解放を忘れずに。
これでファイルの作成ができます。
ファイルの作成部分に関しては、以前に記事にまとめたので
こちらもご参考いただければと思います。
最後に作成したファイル名をテキストボックスに表示しておきましょう。
コードは下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 配列変数filesを作成し、これにフォルダ内のファイルをそれぞれ代入 Dim files As String() = System.IO.Directory.GetFiles("C:\Users\ryoku\Desktop\AryTextFile") ' 事前に内容を書き込む変数を作成 Dim text As New System.Text.StringBuilder ' 事前にファイルを読み取る変数を作成 Dim sr As System.IO.StreamReader = Nothing For Each file As String In files ' 1つずつのファイルについて処理を行う ' リッチテキストボックスにファイル名を表示 Me.RichTextBox1.Text += System.IO.Path.GetFileName(file) + vbCrLf ' ファイルを読み取る準備 sr = New System.IO.StreamReader(file) ' ファイルの内容を最後まで読み取る While sr.Peek >= 0 text.Append(sr.ReadLine + vbCrLf) End While Next file ' 新たなファイルを作成する準備をする Dim sw As System.IO.StreamWriter ' 文字コードを設定 Dim utf As System.Text.Encoding = System.Text.Encoding.UTF8 ' 新たに作成する場所を設定 Dim newFile As String = "./FusionText.txt" ' インスタンスを作成 sw = New System.IO.StreamWriter(newFile, True, utf) ' ファイルを作成 sw.Write(text.ToString) ' オブジェクトの解放 sw.Close() sw.Dispose() sw = Nothing GC.Collect() ' 作成したファイル名を表示 Me.TextBox1.Text = System.IO.Path.GetFileName(newFile) End Sub End Class |
それではこれを実行してみましょう、下のようになれば成功です。
お疲れ様です。
今回は複数のファイルを読み取って、1つのファイルを作成する方法を紹介しました。
考え方次第で、いろいろなやり方があるので今回のはほんの一例として、
参考にしてもらえたらなと思います。
プログラムはプロセスも大事ですが、当然結果も同じぐらい大事です。
どんなプロセスであれ、結果が最終的に同じであればいいときがあります。
まとめ
フォルダ内のファイルを取得するには
ファイルのパスからファイル名と拡張子を取り出すには
・こちらの書籍を参考にVB.Net勉強しています。