VBScript
JScript

[発掘]VBScript & JScript; Tips 2.5 テキストファイルの行単位の読み込み

http://www.happy2-island.com/vbs/cafe02/capter00205.shtml
は多くの参照を得ているにもかかわらず、突然www.happy2-islandごと消えてしまった。
なんの前触れもなく。
そのためいまだ多くのサイトから参照されているにも関わらず、参照できない。
このために必要な部分を復刻するものである。

目次

VBScript&JScript; Tips

■ファイル・フォルダ操作編
2.Scripting.FileSystemObject
2.1 ファイルシステムオブジェクトが基本
2.2 パスを編集する
2.3 フォルダを新たに作る
2.4 テキストファイルを新たに作る
2.5 テキストファイルの行単位の読み込み<<<今回はここ
・他にエラー回避、Subプロシジャ
2.6 テキストファイルの一括読み込み
2.7 テキストファイルへの書きこみ
2.8 フォルダやファイルのコピー
2.9 フォルダやファイルの移動
・応用技でファイルやフォルダ名の変更
2.10 フォルダやファイルの削除
2.11 フォルダやファイルの有無を調べる
・他に中間ファイル(フォルダ)の作成
2.12 ファイルの情報を見る
・サイズ、ファイルの種類、更新日など
2.13 フォルダの情報を見る
・サイズ、更新日など

2.5 テキストファイルの行単位の読み込み

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

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

 なお、このメソッドを使うとアンチウィルスが悪さをしたと勘違いし「ウィルスかもしれません!」なんて警告メッセージが出るかも知れません。

 テキストファイル読み込みの例です。ちょっと長いですね(汗)。でも、たいしたことはしてませんので、あまり構えずに…。

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

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

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

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

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

 で、?~?までが、この処理の肝心な部分です。やっと本題にたどり着きましたね。お待たせしましたっ!(笑)
 テキストファイルオブジェクトから1行ずつ取り出すには、ReadLineというメソッド(?)を使います。先頭から順に1行ずつ読み込んでくれるヤツです。読み込んだ結果は文字列として扱えるので、あとは煮るなり焼くなりお好きなように(笑)。例では、単純にコンソールに表示しています。

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

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

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

■VBScriptの記述例

Option Explicit

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

Dim objParm

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      Loop

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

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

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

End Sub

■JScript(JavaScript)の記述例

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

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

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

// 取得したパラメタが12コより多いときもエラー
} else if (objParm.length > 1) {
   WScript.echo("パラメタが多いです(汗)");
} else {
// 取得したパラメタが1コのときはOK
//テキストファイルの読み込み処理へ飛ばす
   prcTextFileRead();
}

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

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

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

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

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

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

   //?ファイルシステムオブジェクトの作成
   objFileSys = new ActiveXObject("Scripting.FileSystemObject");
   //?読み込むファイルのフルパスを編集
   strFilePath = objFileSys.BuildPath(strScriptPath,strFileName);

   try {

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

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

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

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

      } while(objInFile.AtEndOfStream==false);

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

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

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

}