VBScript - テキストファイルを読み取る(FileSystemObject)

テキストファイルを読み取るには TextStream オブジェクトを使う。

TextStream オブジェクトは次のいずれかの方法で取得する。

  • FileSystemObject オブジェクトの OpenTextFile メソッドを使う

  • File オブジェクトの OpenAsTextStream メソッドを使う

各メソッドの機能は同等なので、どちらの方法を使ってもかまわない。

コード量は OpenTextFile メソッドを使う方が File オブジェクトを取得する必要がない分、わずかだが少なくなる。
特に理由がなければそちらを使っておけば良いだろう。

FileSystemObject オブジェクトの OpenTextFile メソッドを使う

次のスクリプトは OpenTextFile メソッドの使用例である。

Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")

'テキストファイルを開く
Dim ts
Set ts = fso.OpenTextFile("C:\tmp\TextFile1.txt")

'テキストファイル全体を読み取り、メッセージボックスで表示
MsgBox ts.ReadAll

'テキストファイルを閉じる
ts.Close
Set ts = Nothing
Set fso = Nothing

OpenTextFile メソッドの構文は以下のとおり。

FileSystemObject.OpenTextFile (filename, [ iomode, [ create, [ format ]]])

filename:開くファイルのパスを指定する。

iomode:入出力モードを指定する。省略時は ForReading となる。

$$
\def\arraystretch{1.5}
\begin{array}{|l|l|l|}
\hline
\textbf{定数} & \textbf{値} & \textbf{説明} \\ \hline
\text{ForReading} & \text{1} & \text{読み取りモードで開く} \\ \hline
\text{ForWriting} & \text{2} & \text{上書きモードで開く} \\ \hline
\text{ForAppending} & \text{8} & \text{追記モードで開く} \\ \hline
\end{array}
$$

create:filename に指定したファイルが存在しない場合に新しいファイルを作るかどうかを指定する。
新しいファイルを作る場合は True 、作らない場合は False を指定する。
省略時は False となる。

format:開くファイルの形式を指定する。省略時は TristateFalse となる。

$$
\def\arraystretch{1.5}
\begin{array}{|l|l|l|}
\hline
\textbf{定数} & \textbf{値} & \textbf{説明} \\ \hline
\text{TristateUseDefault} & \text{-2} & \text{システムの既定の形式} \\ \hline
\text{TristateTrue} & \text{-1} & \text{Unicode 形式(UTF-16 LE/BE)} \\ \hline
\text{TristateFalse} & \text{0} & \text{Ascii 形式(シフトJIS)} \\ \hline
\end{array}
$$

File オブジェクトの OpenAsTextStream メソッドを使う

次のスクリプトは OpenAsTextStream メソッドの使用例である。

Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")

'ファイルオブジェクトを取得する
Dim file
Set file = fso.GetFile("C:\tmp\TextFile1.txt")

'テキストファイルを開く
Dim ts
Set ts = file.OpenAsTextStream()

'テキストファイル全体を読み取り、メッセージボックスで表示
MsgBox ts.ReadAll

'テキストファイルを閉じる
ts.Close
Set ts = Nothing
Set file = Nothing
Set fso = Nothing

OpenAsTextStream メソッドの構文は以下のとおり。

File.OpenAsTextStream ([ iomode, [ format ]])

引数に指定可能な内容は OpenTextFile メソッドと同様。

TextStream オブジェクトを使ってテキストファイルを読み取る

TextStream オブジェクトが取得できたら、あとは読み取るだけ。

読み取り方は3種類ある。

  • 全体を読み取る

  • 1行読み取る

  • 指定した文字数分を読み取る

テキストファイル全体を読み取る

ReadAll メソッドはテキストファイル全体を読み取る。

次のスクリプトは、ファイルの内容すべてを出力する。

WScript.Echo ts.ReadAll

一度に全体を読み取るため、ファイルサイズに応じたメモリが必要になる。
大きなファイルになるほどメモリ消費量が増えるので注意してほしい。

テキストファイルから1行ずつ読み取る

ReadLine メソッドはテキストファイルから1行読み取る。

改行文字は読み取り結果に含まれない。

次のスクリプトは、ファイルの終端に達するまで1行ずつ読み取り出力する。

Do While Not ts.AtEndOfStream
  WScript.Echo ts.ReadLine
Loop

テキストファイルから指定した文字数を読み取る

Read メソッドはテキストファイルから指定した文字数を読み取る。

TextStream.Read(characters)

characters: 読み取る文字数を指定する。
0 を指定した場合は無限ループになる。
マイナス値を指定した場合は実行時エラーになる。
小数を指定した場合は銀行丸めで整数にされた値が使われる。
引数はバイト数ではなく文字数である点に留意してほしい。

次のスクリプトは、ファイルの終端に達するまで1文字ずつ読み取り出力する。

Do While Not ts.AtEndOfStream
  WScript.Echo ts.Read(1)
Loop

テキストファイルを閉じる

Close メソッドは開いたテキストファイルを閉じる。

開いたファイルは必ず閉じること。

ts.Close

シフトJIS または UTF-16 LE/BE しか扱えない

TextStream オブジェクトが扱える文字コードは、シフトJIS または UTF-16 LE/BE である。

それは OpenTextFile/OpenAsTextStream メソッドの引数 format に指定できる内容を見ていただければわかると思う。

よって、最近の主流である UTF-8 は文字化けしてしまうので注意してほしい。

シフトJIS、UTF-16 LE/BE 以外の文字コードのファイルを処理したい場合は ADODB.Stream を使うとよい。

この記事が気に入ったらサポートをしてみませんか?