|

|
|
 |
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;
}
|
|
|
|
|
|