- 締切済み
VBScriptの読込でのSkipLineの動き
VBScriptでSkipLineで ファイル読み込みで1行ずつ読み飛ばしをしているのですが、 そこで質問があります。 以下のサンプルを実行すると、 「Microsoft VBScript 実行時エラー: ファイルの最後を超えた入力を行おうとしました。」 が出力され処理が終了します。 ですが、エラーがあっても無視して継続させる 「On Error Resume Next ~ On Error Goto 0」 の記述を行うと期待した結果となります。 エラーが合っても無視しろですから処理が行われるのは当たり前ですが、 1行スキップなのに、何故、エラーとなるのでしょうか。 また、その「On Error Resume Next」の記述をせず対処する方法は あるのでしょか。 ------------------------------------------------- Option Explicit Dim fs Dim fin Dim dir Dim path_in Dim strTemp Set fs = CreateObject("Scripting.FileSystemObject") dir = fs.GetParentFolderName(WSH.ScriptFullName) path_in = fs.BuildPath(dir, "test.txt") Set fin = fs.OpenTextFile(path_in, 1) Do While fin.AtEndOfStream <> True strTemp = fin.ReadLine fin.SkipLine WScript.Echo strTemp Loop fin.Close [test.txt] これは1行目です。 これは2行目です。 これは3行目です。 これは4行目です。 これは5行目です。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- okgoo3
- ベストアンサー率74% (20/27)
そりゃ 1回のループごとに 2行進めようとしてるのだから奇数行のファイルではエラーになるでしょ。 ってところに対する処理は先の回答者さんたちが出してる。 んで質問とは直接関係ないのだけれど読んでいて気持ち悪いコードがあったので指摘だけさせてください。 Do While fin.AtEndOfStream <> True これ、 Do Until fin.AtEndOfStream でいいんじゃない? 「『fin.AtEndOfStream プロパティの値が True じゃない』 が True の間」 って意味になるので、 "○○ <> True " っていう評価式はどうも気持ち悪い。。。 そこは「『fin.AtEndOfStream プロパティの値』が True になるまで」 でしょ。
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
No.2です。すみません、編集ミスがありましたのでスクリプトを一応再掲します。 また、No.2で解説しているエラーについては、 Do While fin.AtEndOfStream <> True で防げる実行時エラーと、 If fin.AtEndOfStream Then Exit Do で防ぐべき実行時エラーと、 2種類あるので、両方の記述が必要になる、 という文脈で書かれるべき内奥でした。 解り難くてすみません。 ここで、一応、と書いているのは、 「On Error Resume Next ~ On Error Goto 0」 にコメントを添えるようなやり方で済ませられるなら、 それがいいな、と思っているからです。 ミスと説明不足、すみませんでした。 ' ' /// Dim fs Dim fin Dim dir Dim path_in Dim strTemp Set fs = CreateObject("Scripting.FileSystemObject") dir = fs.GetParentFolderName(WSH.ScriptFullName) path_in = fs.BuildPath(dir, "test.txt") Set fin = fs.OpenTextFile(path_in, 1) Do While fin.AtEndOfStream <> True strTemp = fin.ReadLine WScript.Echo strTemp If fin.AtEndOfStream Then Exit Do fin.SkipLine Loop fin.Close ' ' ///
お礼
ありがとうございます。 訂正ありがとうございます。
- watabe007
- ベストアンサー率62% (476/760)
#3です。 n = fin..Line ↓ 訂正です。 n = fin.Line
お礼
ありがとうございます。 訂正ありがとうございます。
- watabe007
- ベストアンサー率62% (476/760)
>「On Error Resume Next」の記述をせず対処する方法は・・ SkipLineを使わなければ Dim n Do While fin.AtEndOfStream <> True n = fin..Line strTemp = fin.ReadLine If n Mod 2 = 1 Then WScript.Echo strTemp Loop
お礼
ありがとうございます。 解りやすく説明していただきありがとうございます。 勉強になりました。
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
こんにちは。お邪魔します。 Scripting.TextStream.SkipLine メソッド をMSDNで調べると 「TextStream ファイルを読み込むときに次の行をスキップします。」 とありますので、 > ...1行ずつ読み飛ばしをしている ... という要件には合っていると思いますが、 > ... 1行スキップなのに、何故 ... 1行スキップだから、ですね。 例として、 5行(プラスEOF分の改行)分のテキストであれば、 1、3、5行めまで読み込んだら(strTemp = fin.ReadLine)、 それ以上行が無いので、fin.SkipLineは実行時エラーです。 例として、 4行(プラスEOF分の改行)分のテキストであれば、 1、3行めまで読み込んだ後、 fin.SkipLineするとEOF相当の改行位置(5行め)にジャンプしますが、 それ以上テキストが無いので、strTemp = fin.ReadLineは実行時エラーです。 ※テキストの最後に改行だけの行がない場合は、 偶数行ではエラーになりません。 両方の実行時エラーを回避する面倒見の良い書き方を以下に提示します。 ただ、 読込むテキストの保守がしっかりしていて 他の原因による(.SkipLine/.ReadLineでの)エラー の可能性が排除できるのであれば、 On Error で十分ですし、見た人の受けはいいと思います。 気になるようでしたら、今回の疑問が解決した時点で、 スクリプトに自分なりの解説コメントを添えておくと、 読む人(忘れた頃の自分含む)には尚優しいですよね。 ' ' /// Dim fs Dim fin As Scripting.TextStream Dim dir Dim path_in Dim strTemp Set fs = CreateObject("Scripting.FileSystemObject") dir = fs.GetParentFolderName(WSH.ScriptFullName) path_in = fs.BuildPath(dir, "test.txt") Set fin = fs.OpenTextFile(path_in, 1) Do strTemp = fin.ReadLine WScript.Echo strTemp If fin.AtEndOfStream Then Exit Do fin.SkipLine Loop Until fin.AtEndOfStream fin.Close ' ' ///
お礼
ありがとうございます。 解りやすく説明していただきありがとうございます。 勉強になりました。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
以下の行 fin.SkipLine を if fin.AtEndOfStream <> True then fin.SkipLine に変更して下さい。 テキストファイルの行数が奇数行の場合(6行目が無い場合)には、5行目を読み込む strTemp = fin.ReadLine の行を実行した段階で「ファイルの最後」に達します。 ファイルの最後に達したにも関わらず fin.SkipLine を実行しようとすれば、当然 Microsoft VBScript 実行時エラー: ファイルの最後を超えた入力を行おうとしました。 のエラーになります。 奇数行をReadLineした後の fin.SkipLine は「偶数行(2、4、6行目)がある事を期待している」ので、5行しかないtest.txtは「想定外」になり、実行時エラーが発生します。 言い換えれば「3回目のSkipLineは6行目があるつもりで動作するので、エラーになる」のです。 なので、test.txtが これは1行目です。 これは2行目です。 これは3行目です。 これは4行目です。 これは5行目です。 これは6行目です。 のように「偶数行」であれば、プログラムはエラーが出ずに正しく終了します。
お礼
ありがとうございます。 解りやすく説明していただきありがとうございます。 試してみます。
お礼
ありがとうございます。 より良いコードの記述のご指摘ありがとうございます。