VBScriptでファイルから任意の行を取り出す方法

このQ&Aのポイント
  • VBScriptを使用して、特定のファイルから行を取り出す方法について教えてください。
  • VBScriptでファイル内の行を順番に取り出しながら、特定の範囲の行を別のファイルに書き出したいです。
  • 上記のVBScriptコードでは、read.logの特定の行をwrite.logに書き出すことができません。アドバイスをお願いします。
回答を見る
  • ベストアンサー

VBScriptで、ファイルから任意の行のみ取り出す方法について

VBScriptにて、あるファイル内を1行ずつ順番に取り出しながら、 途中の数行を別のファイルに書き出したいのですが、方法が分からず 悩んでいます。 -------------------------------------------------------------- set objFS = CreateObject("Scripting.FileSystemObject") set objReadText = objFS.OpenTextFile("C:\read.log") set objWriteText = objFS.CreateTextFile("C:\write.log") count = 1 Do Until objReadText.AtEndOfStream If count >3 And count < 8 Then strLine = objReadText.ReadLIne objWriteText.WriteLine(strLine) ElseIf count = 8 Then Exit Do End If count = count + 1 Loop objReadText.Close objWriteText.Close -------------------------------------------------------------- 上記にて、例えばread.logの4行目から7行目だけをwrite.logに書き出したいのですが、 想定した途中の行だけを別ファイルに書き出す事が出来ません。 どなたかアドバイスを頂けないでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

set objFS = CreateObject("Scripting.FileSystemObject") set objReadText = objFS.OpenTextFile("C:\read.log") set objWriteText = objFS.CreateTextFile("C:\write.log") count = 0 Do Until objReadText.AtEndOfStream  strLine = objReadText.ReadLIne  count = count + 1    If count >3 And count < 8 Then   objWriteText.WriteLine(strLine)  End If  If count = 8 Then   Exit Do  End If Loop objReadText.Close objWriteText.Close

khaii21
質問者

お礼

有難う御座いました。 間違いが見つけられずモヤモヤしていましたが すっきりしました。

関連するQ&A

  • vbscript ファイルのマージ

    VB初心者です。 C:\test配下の複数のファイルをマージする便利ツールを只今作成中なのですが、 下記プログラムを実行すると「If aryStrings(3) = "yes" Then」の行に対し、 「Subscript out of range」というエラーメッセージが表示されます。 マージの対象としているファイルの中身は次のようなイメージです。 100,101,102,yes,104,105,106,107,108,109,110,111 101,101,102,no,104,105,106,107,108,109,110,111 102,101,102,yes,104,105,106,107,108,109,110,111 103,101,102,no,104,105,106,107,108,109,110,111 104,101,102,yes,104,105,106,107,108,109,110,111 出力データ(output.txt)を見ると正常に処理されているようなのですが なぜこのようなメッセージが表示されるのかご教授いただきたいです。 お手数ですが宜しくお願い致します。 プログラム -------------------------------------------------------------------------------------------------------------------------- Dim FileName Dim fso,baseFolder Dim frFile,toFile Dim mFile Dim strLine1,strLine Dim aryStrings Dim msg FileName = InputBox("ファイル名を入力してください","ファイル名入力","output") Set fso = CreateObject("Scripting.FileSystemObject") Set baseFolder = fso.GetFolder("C:\test") Set toFile = fso.OpenTextFile("C:\test\" & FileName & ".txt" ,2 , True) For Each mFile In baseFolder.Files Set frFile = fso.OpenTextFile("C:\test\" & mFile.Name , 1) Do While frFile.AtEndOfStream <> True strLine1 = frFile.ReadLine() aryStrings = Split(strLine1, ",") If aryStrings(3) = "yes" Then strLine = aryStrings(0) +" "+ aryStrings(1) +" "+ aryStrings(9) +" "+ aryStrings(10) +" "+ aryStrings(11) toFile.Write strLine & vbCrLf Else End If Loop frFile.Close Set frFile = nothing Next toFile.Close msg = "処理終了" MsgBox msg --------------------------------------------------------------------------------------------------------------------------

  • ファイル書き込み

    out.csvファイルに追記していくにはどのように記述すればいいのでしょうか? アドバイス下さい。 Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("c:\test.csv") 'objFile.ReadLine Do While Not objFile.AtEndOfStream StrLine = objFile.ReadLine MyString = split(StrLine,",") ' msgbox Mid(MyString(0),2,10) ' MyString = split(objFile.ReadLine,",") if Mid(MyString(0),2,10) = "(PDH-CSV 4" then Set objWFile=objFSO.OpenTextFile("c:\out.csv",2,true) objWFile.write(StrLine) msgbox "!!!" end if ' if Mid(MyString(0),2,10) = DateString then Set objWFile=objFSO.OpenTextFile("c:\out.csv",2,true) objWFile.write(StrLine) ' 'msgbox Mid(MyString(0),2,10) msgbox "???" end if loop objFile.close Set objFSO = Nothing Set objFile = Nothing

  • VBScriptでCSVファイルを読み出したい

    現在VBScriptでCSVファイルを1行ずつ読み取って、2次元配列に格納するプログラムを作成しています。 CSVファイルの中身は、サンプルで shop,price,sales 001,500,700 003,1200,90 024,,18 という並びになっています。 実データは300件くらいです。 1行目のヘッダーを読み飛ばし、2行目のデータから1行ずつ読取、","でsplitを用いてまず1次配列に格納しています。 1次元配列のarrLine(0)=001、(1)=500、(2)=700と入ったデータを 2次元配列arrshopに順次保存?したいのです。 ---------------------------------------------- dim strLine '1行ずつ読込んだデータを持つ dim ntLineNum '行数のカウント dim arrLine '","で区切った要素を持つ一次元配列 dim arrshop '一次元配列になった要素を2次元配列として格納 Do until .AtEndOfStream   strLine = .ReadLine   if 0<>strComp("",Trim(strLine)) then ntLineNum = intLineNum + 1   end if   arrLine = split(strLine , ",")   arrshop = Array(arrLines,i) i = i + 1 loop ----------------------------------------- msgbox arrshop(2)(0) と指定すると「003」出るようにしたいです。 Array関数が上手くないような気もします・・・。 どなたかご教授お願いします(>_<。)

  • vbscript ファイル操作

    二つのテキストファイルを行レベルで結合したファイルを 作成しようとしています。 ファイルの最後を越えた入力を行おうとしました。 とエラーが吐き出され、結合したファイルがうまく作成されません。 -vbscritptファイル- dim f, f_a, f_b, f_bu, f_mk, wrtxt set f = createobject("scripting.filesystemobject") set f_a = f.opentextfile("c:\temp\a.txt",1) set f_b = f.opentextfile("c:\temp\b.txt",1) set f_mk = f.createtextfile("c:\temp\result.txt") f_mk.close set wrtxt = f.opentextfile("c:\temp\result.txt",2) do while f_b.atendofstream <> true if not f_a.readline & f_b.readline = "" then wrtxt.writeline(f_a.readline & " " & f_b.readline) else exit do end if loop f_a.close f_b.close   -a.txt- 2008/07/01 9:30 2008/07/02 9:59 2008/07/03 9:35 2008/07/04 9:52 2008/07/08 9:45 2008/07/09 9:47 2008/07/10 9:15 2008/07/11 9:44 2008/07/14 9:44 2008/07/15 9:43 2008/07/16 13:19 2008/07/17 9:45 2008/07/18 9:31 2008/07/22 9:39 2008/07/23 9:28 2008/07/24 9:41 2008/07/25 9:58 2008/07/28 9:29 2008/07/29 9:49 2008/07/30 9:50 2008/07/31 9:21 -b.txt- 2008/07/01 18:25 2008/07/02 19:15 2008/07/03 18:45 2008/07/04 19:16 2008/07/08 18:36 2008/07/09 19:14 2008/07/10 18:46 2008/07/11 21:58 2008/07/14 22:36 2008/07/15 19:42 2008/07/16 18:00 2008/07/17 19:19 2008/07/18 18:16 2008/07/22 19:56 2008/07/23 18:42 2008/07/24 18:38 2008/07/25 21:55 2008/07/28 21:31 2008/07/29 22:23 2008/07/30 20:13 2008/07/31 20:00 期待値 2008/7/1 9:30 2008/7/1 18:25 2008/7/2 9:59 2008/7/2 19:15 2008/7/3 9:35 2008/7/3 18:45 2008/7/4 9:52 2008/7/4 19:16 2008/7/8 9:45 2008/7/8 18:36 2008/7/9 9:47 2008/7/9 19:14 2008/7/10 9:15 2008/7/10 18:46 2008/7/11 9:44 2008/7/11 21:58 2008/7/14 9:44 2008/7/14 22:36 2008/7/15 9:43 2008/7/15 19:42 2008/7/16 13:19 2008/7/16 18:00 2008/7/17 9:45 2008/7/17 19:19 2008/7/18 9:31 2008/7/18 18:16 2008/7/22 9:39 2008/7/22 19:56 2008/7/23 9:28 2008/7/23 18:42 2008/7/24 9:41 2008/7/24 18:38 2008/7/25 9:58 2008/7/25 21:55 2008/7/28 9:29 2008/7/28 21:31 2008/7/29 9:49 2008/7/29 22:23 2008/7/30 9:50 2008/7/30 20:13 2008/7/31 9:21 2008/7/31 20:00 vbscriptを使い出したのは最近のため、どこが悪いのかわかりません。 ご指導よろしくお願い致します。

  • vbscriptによる条件分岐とファイル出力

    vbscript初心者です。ご教授頂けますと幸いです。 ネットワーク監視ログが毎朝出力され、そのログの中身を、各サーバにログインし手作業で確認を行っています。 この作業を、VBscriptで行いたいと思っているのですが、どうもうまくいかず困っています。 正常時のログには必ず「1,2」と文字列が出力されます。 この文字列を検索対象にして、「1,2」の記述があれば、新規の結果確認ログに「ネットワークは正常です」とコメントを付けて、ファイルを出力し、 「1,2」が見つからなかった場合は、そのログファイルの3行目のみを、新規の結果ログファイルに抽出する、VBscriptを作成したいと思っています。 異常時のログファイルには、異常を知らせるコメントが3行記述されてます。必要な行は、3行目だけなので、3行目を結果ログとして出力したい。 以下、構文ですがVB初心者であり、色々なサイトを見て作ってみましたが全然動かず今回、ここに投稿しました。 '検索対象のテキストファイルのオープン Set WshShell = WScript.CreateObject("WScript.Shell") Set objFs = CreateObject("Scripting.FileSystemObject") Set objFs = Fs.OpenTextFile(NlbTmp) If Instr(A,"1,2") > 0 Then MsgBox "ネットワークは正常です" Else ”異常の場合の条件分岐が分からず・・・” Set oText = CreateObject("Scriptting.FileSystemObject").CreateTextFile( 結果ログ.log, True ) str = Fs.ReadLine Fs.WriteLine(str) End If 自分で作成するのが初めてな物で本当によろしくお願い致します。

  • ダブルクォートで囲まれたCSVファイルについて

    CSVを読みこんで配列変換するロジックを考えていますがうまくいきません。 ソースは以下の通りです。 Dim objFs Dim objSm Dim strLine Dim arySplit Set objFs = CreateObject("Scripting.FileSystemObject") Set objSm = objFs.OpenTextFile(C:\sample.csv, 1) Do Until objSm.AtEndOfStream strLine = objSm.ReadLine strLine = Right(strLine, Len(strLine) - 1) strLine = Left(strLine, Len(strLine) - 1) arySplit = Split(strLine, "\"\",\"\"") MsgBox UBound(arySplit) Loop Set objSm = Nothing Set objFs = Nothing ※読み込むCSVファイルはダブルクォートが付いています。 ※正常に配列に変換できたかを確認する為、MsgBoxで配列の要素数を表示しようとしています。 やりたい事は 1.まずは先頭と最後のダブルクォートを除外。 2.区切り文字(\",\")で配列に変換。  ※なぜカンマで配列に変換しないかというとダブルクォートで囲まれた値の中にカンマ文字がある為、このような事をしています。 3.変数に変換した配列を格納。 申し訳ありませんがご教授いただけませんでしょうか。 またどうか皆さんのお知恵を私にお貸しいただけませんでしょうか。 何卒、宜しくお願い致します。

  • 読み込むテキストファイルが改行だけの場合について

    あるテキストファイルC:\test.txtが改行だけのファイルの場合、 下記のプログラムにおいて、.Read(1)で何が読み込まれるの でしょうか? Set myFso = CreateObject("Scripting.FilesystemObject") Set mytxt = myFso.OpentextFile("C:\test.txt", 1, 0) With mytxt Do While mytxt.AtEndOfStream <> True mystr = .Read(1) If mystr = "" Then j = 0 End If Loop .Close End With Set mytxt = Nothing

  • 【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 ----------------------------------------

  • [VBScript]csrss.exeメモリリーク

    vbscriptでファイル名にある文字列を含むファイルを検索し、作成日の最も古いファイルをコピーする処理をしています。 下記環境で動かしているのですが、csrss.exeの使用メモリが増加し続けます。 原因または調査の仕方など教えていただけると幸いです。 システムの都合上、別言語への変更はできないのでどうにか解決したいです。 よろしくお願いいたします。 動作環境: windows2003 std sp1 プログラム: Const ForReading = 1 'read only Const ForWriting = 2 'write(overwrite mode) Const ForAppending = 8 'write(add mode) kekka =0 Set objFS = CreateObject("Scripting.FileSystemObject") Set objShell = WScript.CreateObject("WScript.Shell") Set colEnv = objShell.Environment("Process") strNow = Now FILE_NAME = "test_J999" LIST_FILE = "D:\common\" & FILE_NAME & ".log"'use log Set objText = objFS.OpenTextFile(LIST_FILE, ForAppending, True, 0) objText.WriteLine strNow & " copy.vbs start" strSndpath = "D:\common\data\" strRcvpath = "D:\common\" strFileName = search() If objFS.FileExists(strCopyFrom) = False Then Kekka = 0 WScript.Echo kekka objText.WriteLine strNow & " copy.vbs end" & " error: " & err.Number & " file: nothing" objText.Close Set objShell = Nothing Set objFS = Nothing WScript.Quit End If objFS.CopyFile strCopyFrom,strCopyTo IF err.number = 0 Then kekka = 0 Else kekka = err.number End IF WScript.Echo kekka objText.WriteLine strNow & " copy.vbs end" & " error: " & err.Number & " file: " & strFileName objText.Close Set objShell = Nothing Set objFS = Nothing Function search() On Error Resume Next 'error ignore Set objApl = Wscript.CreateObject("Shell.Application") Set folder = objFS.GetFolder(strSndpath) Set folinfo = objApl.NameSpace(strSndpath) Mostoldtime = strnow Totalcnt = folinfo.Items().count+5 Redim File(Totalcnt) i=0 For each t in File If Instr(t , FILE_NAME) > 0 then strfilepath = strSndpath & "\" & t Set fileinfo = objFS.GetFile(strfilepath) 'serch most old file If fileinfo.DateCreated < Mostoldtime then Mostoldtime = fileinfo.DateCreated Filename = t End If End If Next Erase File Set objApl = Nothing search = (Filename) End function

  • VBScriptでの文字列置換処理

    10列あるCSVファイルに初期値0の列を5番目に追加したいので .vbsファイルを作成し下記のように書きました。(抜粋) でも置換されたファイルが作成されず困っています。 Set objFS = CreateObject("Scripting.FilesystemObject") Set objInFile = objFS.OpenTextFile(strTargetFile, ForReading) strData = objInFile.ReadAll objInFile.Close   strData = ReplaceTest(strData, "^(.*?,)(.*?,)(.*?,)(.*?,)(.*)$", "\1\2\3\40,\5")    strNewFilePath = getFilePath(strTargetFile) strNewFile = objFS.BuildPath(strNewFilePath, objFS.GetTempName) Set objNewFile = objFS.CreateTextFile(strNewFile, ForWriting) '中間ファイルへの書き込み objNewFile.Write strData objNewFile.Close objFS.DeleteFile strTargetFile objFS.MoveFile strNewFile, strTargetFile '置換関数 Function ReplaceTest(str1, patrn, replStr) Dim regEx Set regEx = New RegExp regEx.Pattern = patrn regEx.IgnoreCase = True ReplaceTest = regEx.Replace(str1, replStr) ' 置換します。 End Function

専門家に質問してみよう