2.5 テキストファイルの行単位の読み込み
 テキストファイルを読み込むときの方法です。テキストファイルを読み込む場合はファイルシステムオブジェクトのOpenTextFile(ファイルのオープン)、テキストファイルオブジェクトReadLine(行の読み込み)・Close(ファイルを閉じる)の2つのメソッドとAtEndOfStreamというプロパティを使います。

 また、ファイルの有無をチェックするためにOn Error Resume Nextでのエラー回避が必要な場合も多いでしょう。そんなわけで、使ってみます。

 なお、このメソッドを使うとアンチウィルスが悪さをしたと勘違いし「ウィルスかもしれません!」なんて警告メッセージが出るかも知れません。
使用例
 テキストファイル読み込みの例です。ちょっと長いですね(汗)。でも、たいしたことはしてませんので、あまり構えずに…。

 例は、プログラムがあるフォルダ内に(プログラムが保存されているフォルダ内に)あるファイルを1行ずつ読み、その内容をコンソール(プロンプト画面)に表示するという処理をしています。読み込みたいファイルは、プログラム起動時にパラメタで与えます。

 まず、パラメタの受け取り処理(1.3 起動時にパラメタを与えるを参照)です。@〜BとEの部分がそれです。このプログラムでは、必要なパラメタは1つ(ファイル名を与える)なので、1つよりも多くても少なくてもエラーとして処理を終了し、パラメタが正しく指定されていた(1コだけ指定されていた)ときは、Call prcTextFileReadでテキストファイルの読み込み処理を呼び出します(C)。


 以降はテキストファイル読み込み処理(prcTextFileRead)の処理です。

 先頭にあるOn Error Resume Next(D)は、エラーが出ても気にせずに処理を続けなさいという指定なのですが、ここでは後で行うテキストファイルのオープン(OpenTextFile)で、もしもファイルが無かったときに異常終了しないための呪文です。詳しくは、後で出てくるのでとりあえず置いといて…。

 FとGとHは、毎度お馴染みのプログラムが居座っているフォルダのフルパス取得と(1.5 自分が保存されているフルパスを得るを参照)と、ファイルシステムオブジェクトの作成、目的のファイルまでのフルパスの作成(2.2 パスを編集するを参照)です。

 で、I〜Oまでが、この処理の肝心な部分です。やっと本題にたどり着きましたね。お待たせしましたっ!(笑)

 Iで、OpenTextFileメソッドを使いファイルをオープンします。パラメタは目的のファイルまでのフルパスオープンするときの方法(この例では読み込み)を指定します。でも、もしかするとファイルが無かった…なんてこともありえませんか?そんなわけで、Jでそれをチェック!ファイルのオープン(OpenTextFileメソッドの実行)を行った直後にErr.Numberでオープンの結果コードを参照し、0であればファイルがあった0以外ならファイルが無かった(泣)、という判断をしています。
 ただし、Err.Numberで結果コードを参照したいときは、On Error Resume Nextを入れておく必要があります。これを入れておかないと、エラーが出た時点でプログラムが止まってしまいます。
 なお、オープンしたファイルはオブジェクトとしてOpenTextFileメソッドから渡されるので、Set文で保存します。※以降では、テキストファイルオブジェクトと書きます。

 ファイルのオープンに成功したら、あとはファイルの内容を1行ずつ読んでその内容を画面に表示するという処理を、全ての行を読み終えるまで行っています。Do 〜 Loopがグルグル回る部分(K)です。全ての行の読み込みが終了したかという判断は、テキストファイルオブジェクトAtEndOfStreamというプロパティを調べると分かります。このプロパティがTrueのときが、ファイルにはこれ以上行は無いよ!ということ。Loop Untilなので、読み込む行が無くなるまでというループになりますね。

 テキストファイルオブジェクトから1行ずつ取り出すには、ReadLineというメソッド(L)を使います。先頭から順に1行ずつ読み込んでくれるヤツです。読み込んだ結果は文字列として扱えるので、あとは煮るなり焼くなりお好きなように(笑)。例では、単純にコンソールに表示しています。

 ループを抜けるとテキストファイルオブジェクトCloseというメソッドを実行(N)していますね。これは、使い終わったテキストファイルを閉じてくれ!という命令です。とにかく、開けたら閉じましょう。それが鉄則!

 あとOの部分だけど、これはIでファイルのオープンに失敗したときに出すメッセージです。Jのif文でErr.Numberが0以外(ファイルが無かった)ときに出ます。Pは、オブジェクトを使ったときは、最後にオブジェクト用の変数にこれをやっておいてください。

 ちなみに、On Error Resume Nextを入れると、ファイルの有無のエラー以外に普通の文法エラーも飛ばしてしまうという恐ろしい命令なので、使うときは注意してくださいね。それにしても長かった…ので、ちょっと休憩(汗)

 ■VBScriptの記述例
Option Explicit

'定数の宣言
Const ForReading = 1 '読み込み
Const ForWriting = 2 '書きこみ(上書きモード)
Const ForAppending = 8 '書きこみ(追記モード)

Dim objParm

'@パラメタ情報の保存
Set objParm = Wscript.Arguments

'A取得したパラメタが1コ未満のときはエラー
If objParm.Count < 1 Then
   WScript.echo "パラメタが足りません(汗)"

'B取得したパラメタが1コより多いときもエラー
ElseIf objParm.Count > 1 Then
   WScript.echo "パラメタが多いです(汗)"

Else
'C取得したパラメタが1コのときはOKなので
'テキストファイルの読み込み処理へ飛ばす
   Call prcTextFileRead
End If

'オブジェクト破棄
Set objParm = Nothing

'これ以降はCallなどで呼び出さない限り実行しない。

'=============================================================
'以降はテキストファイル読み込みのプロシジャ
'上のCから呼び出される
'=============================================================
Sub prcTextFileRead()

   'Dファイルの有無を調べるために定義
   On Error Resume Next

   Dim objFileSys
   Dim objInFile
   Dim intSep
   Dim strScriptPath
   Dim strFileName
   Dim strFilePath
   Dim strRecord

   'Eパラメタを保存(ファイル名として使用)
   strFileName = objParm(0)

   'Fプログラムが保存されているフォルダを取得します
   strScriptPath = Replace(WScript.ScriptFullName,WScript.ScriptName,"")

   'Gファイルシステムオブジェクトの作成
   Set objFileSys = CreateObject("Scripting.FileSystemObject")

   'H読み込むファイルのフルパスを編集
   strFilePath = objFileSys.BuildPath(strScriptPath,strFileName)

   'Iファイルのオープン(読み込みで開く)
   Set objInFile = objFileSys.OpenTextFile(strFilePath,ForReading)

   'Jファイルのオープンが成功(ファイル有り)のときはErr.Numberが0
   If Err.Number=0 Then

      'Kファイルの内容を全部読み終えるまでループ
      Do Until objInFile.AtEndOfStream = true

         'Lファイルの内容を1行ずつ読み込む
         strRecord = objInFile.ReadLine

         'M読み込んだ内容をコンソールへ表示
         WScript.echo strRecord

      Loop

      'Nファイルのクローズ
      objInFile.Close

   'Oファイルのオープンが失敗(ファイル無し)のときはErr.Numberが0以外
   Else
      Wscript.Echo strScriptPath & "にファイル" & strFileName & "がありませんでした。"
   end if

   'Pオブジェクトの破棄
   Set objFileSys = Nothing
   Set objInFile = Nothing

End Sub

 ■JScript(JavaScript)の記述例
//定数の宣言
var ForReading = 1; //読み込み
var ForWriting = 2; //書きこみ(上書きモード)
var ForAppending = 8; //書きこみ(追記モード)

//@パラメタ情報の保存
var objParm = WScript.arguments;

//A取得したパラメタが1コ未満のときはエラー
if (objParm.length < 1) {
   WScript.echo("パラメタが足りません(汗)");

//B取得したパラメタが12コより多いときもエラー
} else if (objParm.length > 1) {
   WScript.echo("パラメタが多いです(汗)");

} else {
//C取得したパラメタが1コのときはOK
//テキストファイルの読み込み処理へ飛ばす
   prcTextFileRead();
}

//オブジェクト破棄
objParm = null;

//これ以降はCallなどで呼び出さない限り実行しない。

//=============================================================
//以降はテキストファイル読み込みのプロシジャ
//上のCから呼び出される
//=============================================================
function prcTextFileRead() {

   var objFileSys;
   var objInFile;
   var strScriptPath;
   var strFileName;
   var strFilePath;
   var strRecord;

   //Eパラメタを保存(ファイル名として使用)
   strFileName = objParm(0);

   //Fプログラムが保存されているフォルダを取得します
   strScriptPath = String(WScript.ScriptFullName).replace(WScript.ScriptName,"");

   //Gファイルシステムオブジェクトの作成
   objFileSys = new ActiveXObject("Scripting.FileSystemObject");

   //H読み込むファイルのフルパスを編集
   strFilePath = objFileSys.BuildPath(strScriptPath,strFileName);

   try {

      //Iファイルのオープン(読み込みで開く)
      objInFile = objFileSys.OpenTextFile(strFilePath,ForReading);

      //Jファイルのオープンが成功(ファイル有り)のときに実行
      //Kファイルの内容を全部読み終えるまでループ
      do {

         //Lファイルの内容を1行ずつ読み込む
         strRecord = objInFile.ReadLine();

         //M読み込んだ内容をコンソールへ表示
         WScript.echo(strRecord);

      } while(objInFile.AtEndOfStream==false);

      //Nファイルのクローズ
      objInFile.Close();

   //Oファイルのオープンが失敗(ファイル無し)のとき
   } catch(e) {
      WScript.echo(strScriptPath + "にファイル" + strFileName + "がありませんでした。");
   }

   //Pオブジェクトの破棄
   objFileSys = null;
   objInFile = null;

}
Copyright(C) 1999-2006 結城圭介。 All rights reserved