• 締切済み

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行目です。

みんなの回答

  • okgoo3
  • ベストアンサー率74% (20/27)
回答No.6

そりゃ 1回のループごとに 2行進めようとしてるのだから奇数行のファイルではエラーになるでしょ。 ってところに対する処理は先の回答者さんたちが出してる。 んで質問とは直接関係ないのだけれど読んでいて気持ち悪いコードがあったので指摘だけさせてください。 Do While fin.AtEndOfStream <> True これ、 Do Until fin.AtEndOfStream でいいんじゃない? 「『fin.AtEndOfStream プロパティの値が True じゃない』 が True の間」 って意味になるので、 "○○ <> True " っていう評価式はどうも気持ち悪い。。。 そこは「『fin.AtEndOfStream プロパティの値』が True になるまで」 でしょ。

abc999xyz
質問者

お礼

ありがとうございます。 より良いコードの記述のご指摘ありがとうございます。

回答No.5

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 ' ' ///

abc999xyz
質問者

お礼

ありがとうございます。 訂正ありがとうございます。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.4

#3です。 n = fin..Line   ↓ 訂正です。 n = fin.Line

abc999xyz
質問者

お礼

ありがとうございます。 訂正ありがとうございます。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

>「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

abc999xyz
質問者

お礼

ありがとうございます。 解りやすく説明していただきありがとうございます。 勉強になりました。

回答No.2

こんにちは。お邪魔します。 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 ' ' ///

abc999xyz
質問者

お礼

ありがとうございます。 解りやすく説明していただきありがとうございます。 勉強になりました。

  • chie65535
  • ベストアンサー率43% (8523/19372)
回答No.1

以下の行 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行目です。 のように「偶数行」であれば、プログラムはエラーが出ずに正しく終了します。

abc999xyz
質問者

お礼

ありがとうございます。 解りやすく説明していただきありがとうございます。 試してみます。

関連するQ&A

  • VBScriptでレコードがない場合エラーになる

    VBScriptを使ってHTAを作っています。 ちょっと疑問なのですが、以下のようなコードでレコードがないと 「カレントレコードがありません」というエラーになってしまいます。 txtSQL = "SELECT * FROM test" Set rs = db.OpenRecordSet(txtSQL) ' dbはDAOのデータベースオブジェクト プロシージャで On Error Resume Nextすればエラーになりませんが、 そうなるとありえる全エラーをErrオブジェクトを使ってcatchしないと いけなくなり面倒です。 On Error Resume Nextなしで、ありえるエラーの中で特定のものを (今回は「カレントレコードがない」エラーです)エラーでなくす ことはできないのでしょうか? または プロシージャの中で On Error Resume Nextを使って、 プロシージャの途中でまたエラーで停止するような命令はない のでしょうか? 教えていただけると幸いです。

  • 【VBScript】ディレクトリ内のファイルを、リストを読み込んで分割

    【VBScript】ディレクトリ内のファイルを、リストを読み込んで分割 ■プログラム及びファイルに関する備考 .\test\     = 分割を行いたいファイルが格納されたディレクトリ Dir_FileList.txt = testディレクトリ内のファイルをリスト化したもの。           相対パスにて、1行ずつ改行して記述する。 ■やりたい事 Dir_FileList.txtという、.\test\内に配置されたファイルをリスト化したtxtを 1行ずつ読み込み、読みこんだファイルに対し、10行毎に分割処理を行いたいと思っています。 分割したファイルは、分割元のファイルが格納されたディレクトリと同じ、.\test\ディレクトリに作成し、 分割前の元ファイルを最後に削除するという処理をリストに書かれた全てのファイルに対して行いたいです。 下記のようにコーディングをしたのですが、 どうも「Do Until ( fILE1.AtEndOfStream )」のループ文の処理が行われていない?ようで、 testディレクトリ内部のファイルが分割されません。 色々試したのですが、VBScriptを触るのは初めてでなかなか上手くいきませんでした。 どこが間違っていて、どのように修正すれば動くようになるでしょうか? お手数ですが、ご教授をお願い致します。 ---------------------------------------- Option Explicit Dim flReadFSO, flReadFSO2, fFolder, fILE, flrSubFolder Set flReadFSO = CreateObject("Scripting.FileSystemObject") Set flReadFSO2 = WScript.CreateObject("Scripting.FileSystemObject") Set fFolder = flReadFSO2.GetFolder(".") Dim name1, fILE1 name1 = fFolder & "\Dir_FileList.txt" Set fILE1 = flReadFSO.OpenTextFile(name1) Dim oneLineTxt oneLineTxt ="" Dim FSO set FSO = WScript.CreateObject("Scripting.FileSystemObject") Do Until ( fILE1.AtEndOfStream ) oneLineTxt = fILE1.ReadLine WScript.Echo oneLineTxt arg = ".\test\test01.txt" set fin = FSO.OpenTextFile(arg, 1) fbn = FSO.GetBaseName(arg) fen = FSO.GetExtensionName(arg) nf=0 set fout = FSO.OpenTextFile(".\test\" & fbn & "_" & nf & "." & fen, 2, true) nl=0 Do While Not fin.AtEndOfStream fout.WriteLine fin.ReadLine nl=nl+1 if nl>9 then fout.Close nf=nf+1 if nf>9 then exit do set fout = FSO.OpenTextFile(".\test\" & fbn & "_" & nf & "." & fen, 2, true) nl=0 end if Loop fin.Close FSO.DeleteFile arg, True Loop fILE1.Close ----------------------------------------

  • エラー処理

    環境:IIS,ASP(VBScript) サーバー Windows2000Server ASP超初心者です。 処理の途中でエラーになっても On Error Resume Next と If Err.Number then ........ を組み合わせればうまく逃げられるのはわかるの ですが、On Error Resume Nextを書いてもエラー が表示されて落ちます。 #include file の中についてはOn Error Resume Nextは無効なのでしょうか?

  • VBScriptの変数宣言

    ASPでvbscriptを使って処理をしているページの修正を行っていたのですが、その中で不思議な状態が発生しています。 <% Option Explicit On Error Resume Next %> ===== 省略 ===== <% filename = Trim(bobj.Form(bin,"filename")) Dim filename ===== 省略 ===== 普通、上記のような記述ではfilenameの代入のところでエラーが発生すると思うのですが、代入処理の直後にerr.numberを判定しても、エラーが発生していないんです。 includeしてあるファイルの内部も検索しましたが、filenameの変数宣言は見つかりませんでした。 VBScriptって、どこで変数宣言を行っても有効になるのでしょうか? 正常に動いているので、今のところ問題は無いのですが、何か気持ち悪くて。。。 似たような現象が起こった事のある方や、これが正しい動きだというご指摘をお願いいたします。

  • VBScriptのOpenTextFileメソッドのようなことをJavaScriptで行いたい

    VBScriptの指定されたファイルを開き、ファイルを読み込んだりするOpenTextFileメソッドのようなことを JavaScriptを用いて行いたいんですがどのようにすればいいんでしょうか? できれば、以下ソースと対比したソースを張っていただけるとありがたいです。よろしくお願いします。 Sub OpenTextFileTest Const ForReading = 1, ForWriting = 2, ForAppending = 3 Dim fs, f Set fs = CreateObject("Scripting.FileSystemObject") Set f = fs.OpenTextFile("c:\testfile.txt", ForAppending,TristateFalse) f.Write "Hello world!" f.Close End Sub

  • Jスクリプトではどうなりますか

    クッキーと最近使用したファイルを削除するスクリプトを書いてます。 VBSでは '------------------------------------ dim Fs Set Fs = WScript.CreateObject("Scripting.FileSystemObject") '最近使ったファイルを削除 Fs.DeleteFile "C:\WINDOWS\Recent\*.*" 'クッキーを削除 On Error Resume Next Fs.DeleteFile "C:\WINDOWS\Cookies\*.txt" msgbox "削除しました。" '------------------------------------ となりますがこれをjスクリプトで書くとどうなりますでしょうか?   

  • Onってなんでしょうか?

    私は現在、VB6を使用してプログラム開発を行っています。 「On Error」ステートメントに関して質問させていただきます。 私の管理下のソースに、   (1)「On Error Goto [行ラベル]」   (2)「On Err Goto [行ラベル]」 の2種類のステップがあり、 (2)に関しての動作が不明で困っています。 (要は「On [Object] Goto [行ラベル]」と記述した場合に、  どのように解釈されるのか分らないのですが・・・  (1)、(2)共にコンパイルは通りますが(2)の場合はエラーハンドリングはできません。) <質問> (1)「On Err Goto [行ラベル]」 と記述した場合、  どのような条件でGotoが実行されるのでしょうか?  (Errはエラーオブジェクトです) (2)「On」は   ・「On Error Goto [行ラベル]」   ・「On Error Resume Next」   ・「On Error Goto 0」  以外に使用する方法があるのでしょうか?

  • VB6.0にてStreamReaderを使用したいのですが、

    VB6.0にてStreamReaderを使用したいのですが、 Dim Reader As New IO.StreamReader("C:\Windows\System32\eula.txt", のコードが赤字でエラーになります。 どう修正すればよろしいでしょうか? ご存知の方教えてください。よろしくお願いします。 Dim strTemp As String Dim Reader As New IO.StreamReader("C:\Windows\System32\eula.txt", System.Text.Encoding.GetEncoding("Shift-JIS")) strTemp = Reader.ReadToEnd msgobox strTemp Reader.Close

  • Pythonファイル読み書きについて

    ファイル読み書きで躓いています。 やりたい事は、以下の5行のa.txtを読んで、b.txtに吐き出します。 a.txt  1First Row  2Second Row  3行目  (4)         ※4が○で囲まれてるやつ  5行目 以下コードです。 import codecs fin = codecs.open(r'D:\Work\a.txt', 'r', 'shift-jis') fout = codecs.open(r'D:\Work\b.txt', 'w', 'shift-jis') for line in fin: print line fout.write(line) fin.close() fout.close() 4行目でエラーとなります。 これを正常動作させる事はできるのでしょうか? よろしくお願いします。

  • VBScript で ADO Streamオブジェクトの Writeを使いたい

    VBScriptでバイナリファイルを書き込みたいのですが、以下のコードで Writeしようとするとコンパイルエラーとなります。 なぜですか? Option Explicit Dim stream Dim i Dim line Set stream = CreateObject("ADODB.Stream") stream.Open stream.Type = 1 line = Array(61,0,13,0,10,0) stream.Write line stream.SaveToFile "bbb.txt", 2 stream.Close Set stream = Nothing

専門家に質問してみよう