• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBSで配列の結果内容から任意の文字列を探す。)

VBSで配列の結果内容から任意の文字列を探す方法

このQ&Aのポイント
  • VBS初心者の方が、配列の結果内容から任意の文字列を探す方法を知りたいです。具体的には、配列を1つにまとめた内容から正規表現を利用して任意のキーワードを元に検索結果を取得したいとのことです。
  • 質問文章では、VBSの配列を1つにまとめた内容(strMSG)から先頭が001で始まる行を検索する例を挙げています。その理想的な実行結果を示しています。
  • また、質問者はテスト配列の単位ごとにgrepをかけるよりも、配列を1つにまとめた内容に1度だけgrepをかけた方が処理速度が速いのではないかと考えています。

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

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

>4行分TESTの配列が格納されています。 正規表現を使うまでもないのでは Option Explicit Dim TEST(3),i,strMSG Dim TEST2 TEST(0) = "001-AB1" TEST(1) = "001-AB2" TEST(2) = "AB1-001" TEST(3) = "AB2-001" For i = 0 To UBound(TEST) If Left(TEST(i), 3) = "001" Then strMSG = strMSG & TEST(i) & vbCrLf End If Next MsgBox strMSG 別案 TEST(0) = "001-AB1" TEST(1) = "001-AB2" TEST(2) = "AB1-001" TEST(3) = "AB2-001" TEST2 = Filter(TEST, "001-") msgbox JOIN(TEST2, vbCrLf)

wansui
質問者

お礼

ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

#1さんの仰る通りなんですが、この手の速度ネタは好きなので試してみました。 ExcelVBAですが、試験データをワークシート関数で作っているところ以外は、VBSでも同様に動くと思います。 最初試験データをワークシートにおいて使い回ししようとおもったので、途中で方針転換しましたが、そのまま使っています。 なお、0msecになっているところは、GetTickCountの精度の関係ですが、数十msecでは終わっていると思います。 また、10000件程度では大して差が出ませんでした。 結論から言うと、配列を一個の文字列に合成してから正規表現検索を行うのは予想外に速いですが、 strMSG = strMSG + TEST(i) & vbCrLf の方法による文字列合成は世間で言われている通り高コストで、こちらが律速になってしまいます。Midステートメントを使いましょう。 http://www.moug.net/tech/exvba/0140045.html Private Declare Function GetTickCount Lib "kernel32" () As Long Sub test1() Dim myArray() As String Dim buf1 As String Dim buf2 As String Dim i As Long Dim regEx, matches Const maxNo As Long = 100000 ReDim myArray(1 To maxNo) Set regEx = CreateObject("VBScript.RegExp") With regEx .Pattern = "001-.{3}" .IgnoreCase = True .Global = True End With buf2 = String(maxNo * (7 + 1) - 1, ",") Debug.Print "1:" & CStr(GetTickCount) For i = 1 To maxNo myArray(i) = Evaluate("=IF(RAND()>0.5,TEXT(RANDBETWEEN(1,999),""000"")&""-"" & CHAR(RANDBETWEEN(65,90)) & CHAR(RANDBETWEEN(65,90)) & TEXT(INT(RAND()*10),""0""),TEXT(RANDBETWEEN(1,999),""000"")&""-"" & CHAR(RANDBETWEEN(65,90)) & CHAR(RANDBETWEEN(65,90)) & TEXT(INT(RAND()*10),""0""))") Next i Debug.Print "2:" & CStr(GetTickCount) 'ここは乱数でのテストデータ生成にかかる時間なので関係ないが、上記関数使用は遅い。 For i = 1 To maxNo Set matches = regEx.Execute(myArray(i)) Next i Debug.Print "3:" & CStr(GetTickCount) '文字列配列の個々にregExで検索 125msec buf1 = myArray(1) For i = 2 To maxNo buf1 = buf1 & myArray(i) Next i Debug.Print "4:" & CStr(GetTickCount) '文字列=文字列+付加文字列で文字列合成 16099msec For i = 1 To maxNo Mid(buf2, (i - 1) * 8 + 1, 7) = myArray(i) Next i Debug.Print "5:" & CStr(GetTickCount) 'Midで文字列合成 測定不能 0msec Set matches = regEx.Execute(buf2) Debug.Print "6:" & CStr(GetTickCount) 'regExで一括検索 測定不能 0msec 'ちゃんと抽出できた事の確認 100個弱が該当 For i = 0 To matches.Count - 1 Debug.Print matches(i) Next i Set matches = Nothing Set regEx = Nothing End Sub

wansui
質問者

お礼

ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • [VBS] 動的配列について教えてください!

    VBS初心者です。 以下のように、リストを読み込んで動的配列に持たせたいです。 ----------------------------------------------------------------- GET_FILE = "sample.txt" SET objFs = CreateObject("Scripting.FileSystemObject") ' 動的配列セット Call Array_Set("AryVal",GET_FILE) ' 表示 For i = 0 To Ubound(AryVal) msgbox AryVal(i) Next ' 終了 WScript.Quit 0 Function Array_Set(AryName,ReadFile) Set strVal = objFs.OpenTextFile(ReadFile) ' 1行づつ処理 Do While strVal.AtEndOfStream <> True i = i + 1 ReDim Preserve AryName( i - 1 ) AryName( i - 1 ) = strVal.ReadLine Loop End Function ----------------------------------------------------------------- 見て頂くと分かるとおり、動的配列として持たせたい変数名を Functionの引数として渡しています。(当然のごとくエラー、、、) Functionの引数として渡した値に動的配列が格納される方法があれば教えてください。 よろしくお願いします。

  • vbsの文字列比較について

    vbsプログラムでInstr()を使用して文字列を比較しているのですがうまくいきません。何か知っている方がいましたら教えてください。 Dim index Dim str Dim result '結果の保存 'sheetnameにはシート名(aaaテスト)が保存されています。 str = Array("テスト","test") For i=0 to UBound(str) step 1 index = InStr(str(i),sheetname) If index > 0 Then result = i next

  • (VBA) 配列の文字列を昇順で並べ替えたい

    タイトルの通り、配列に格納したファイル名を昇順に並べ替えたいのですが、期待通りに動作しません。 内部コード(ユニコード?)順には並んでいるようですが、エクスプローラの名前順と同等にはなりません。 どのようにしたら、配列のファイル名をエクスプローラと同じように並べ替えできますか? (テストに使用したコード) Public Sub Test1() Dim FileNames() As String Dim WSH As Object Dim MyPathName As String Dim MyFileName As String Dim i As Integer Dim j As Integer '処理対象フォルダを指定 Set WSH = CreateObject("WScript.Shell") MyPathName = WSH.SpecialFolders("MyDocuments") Set WSH = Nothing i = 0 MyFileName = Dir(MyPathName & "\" & "*.*") If MyFileName = "" Then MsgBox "対象ファイルが1つも見つかりません。", , "処理終了" Exit Sub End If 'ファイル一覧を配列に格納 Do Until MyFileName = "" i = i + 1 ReDim Preserve FileNames(1 To i) FileNames(i) = MyFileName MyFileName = Dir Loop '配列を並べ替える For i = 1 To UBound(FileNames) - 1 For j = i To UBound(FileNames) If FileNames(i) > FileNames(j) Then MyFileName = FileNames(i) FileNames(i) = FileNames(j) FileNames(j) = MyFileName End If Next j Next i End Sub ※以降の処理は、Excel で処理するか Access で処理するかまだ決めていません。  (投稿文字数の関係で詳細は省略)

  • 正規表現でマッチさせたい文字列の指定方法

    正規表現でマッチさせたい文字列の指定方法について こんにちは。正規表現について教えてください。 秀丸エディタでgrepする時に先頭行に 『ファイル名(行数): 』という文字列が 先頭行に入りますが、これを正規表現を使用して消したいと思っています。 具体的には以下のような表現ですが、どのように指定するのが正しいでしょうか。 いくらかテストしているのですが、なかなかうまくできず困っています。 消したい文字列 test.log-110411-01.bak.text(38): よろしくお願いします

  • 配列のから一致する文字列を検索して1行下の数値を取得する方法

    どうもはじめまして。 どなたかperlの詳しい方、アドバイスをいただけないでしょうか。。 タイトルの通り配列の中から一致する文字列を検索して 1行下の数値を取得する方法が知りたいです。 簡単に言えば、、 ・キーワード解析のページにアクセスし、結果HTMLソースを取得します  ※ここまではできてます ・取得したHTMLソースからキーワードの検索回数を抜き出したいのですが、下記のようなソースになっています。 ■HTMLソース 一部抜粋 ---- <タグ>google で 「ほげ」 を検索した結果<タグ> <タグ> 35,233回<タグ> <タグ>google で 「ほげ」 +αを検索した結果<タグ> <タグ> 5,095回<タグ>         ・         ・ αの部分はアンド検索などで一緒に検索された文字を示す ---- 抜き出したいのは「ほげ」のみの検索回数 35,233 の値です。 この値をどのように取得してよいか、効率的な方法が思い浮かびません。 どなたかアドバイスいただけないでしょうか、よろしくお願い致します。 m(_ _ )m

  • ファイルの文字列の処理の質問

    今ファイルに対して文字列の処理をしています。 あるファイルに対して一定の文字列を検索して、その検索したい文字列が なければ、その一行をファイルに出力したいですが、手元にwindowsバージョン のgrep.exe で実現すると考えています。 しかし、検索したいファイルは、文字列が入ってない行があります。 そのため、検索したい文字列が存在しない行は、改行だけの行を結果として 出力されています。改行だけの行を除きたいですが、どうすればいいか? ファイルのsjisです。例えば、内容としては、以下のようになっています。 aiiiiii ballllll fafafa 777777 とするファイルがあります。そのファイルに対して、aという文字が入ってない行を 取りたいですが、実際にgrep -v "a" ファイル名 でやると、777777の行とすべて 改行だけある行が取られてました。 777777だけをとる方法がありますでしょうか?

  • diffコマンド結果詳細内容について

    diffコマンド結果詳細内容について 以下、実行ログになります。 test_svrver33%cat aa 123 456 789 aaa bbb ccc ddd test_svrver34%cat bb 123 456 ccc ddd test_svrver35%diff aa bb 3,5d2 < 789 < aaa < bbb test_svrver36% diffコマンドの実行結果1行目の 3,5d2 について 詳しく知りたいのですが 3,5 については3行目~5行目だと わかったのですが、d2 についてどうしても調べきれなかったので ご教授よろしくお願い致します。

  • 関数に文字列を渡すことについて

    参考書にあったプログラムなのですが、 ------------------------------------------- #include<stdio.h> void strout(char ss[ ]); int main(void) { char st[ ]="ABCDEF"; strout(st); strout("ABab12"); return 0; } void strout(char ss[ ]) { int i; printf("ss=%s\n",ss); i=0; while(ss[i]){ printf("%X ",ss[i]); ++i; } printf("\n"); } ---------------------------------------------- ------------実行結果--------------- ss=ABCDEF 41 42 43 44 45 46 ss=ABab12 41 42 61 62 31 32 ----------------------------------- 初心者という事で、いろいろと疑問があるのですが、 ◎1「stとして、文字配列をss[ ]に渡すのと、"ABab12"として直接文字列をss[ ]に渡すのはとは、どういうことなのかということ。そしてその時ss[ ]はどうなっているか?」 ◎2「実行結果で、最初のprintfからループさせなくてもss=ABCDEF、ss=ABab12が何故2つとも表示され、2つとも16進数が表示されるのか?」 ◎3「while(ss[i])だけで何故、'\0'でない間ループするという事が出来てしまうのか?」 以上のような疑問があります。 先頭のアドレスを渡すといったような説明はあるのですが、いまひとつ分かりません。 教えていただけると嬉しいです。

  • MsDosでファイル名とファイル内の文字列の検索

    リナックスコマンドでいうところの find -name xxxx -exec grep $test {} \;の処理を コマンドプロンプトにて、利用したいと考えています。 dir xxxx /s /b | find "$test" こういった記述で出来るのではないかと考えたのですが。 findが"ファイル名"を検索するためファイルの中身を検索してくれません。 何かいい方法は御座いませんか? また、dirで取得したパスを配列に入れて、foreachでファイルの中身を検索し続けるということは可能でしょうか? よろしくお願いいたします。

  • エクセルVBAで特定文字列の個数を高速に調べたい

    文字列の入っている変数内で特定の文字列(今回はvbCrLf)が何個発生しているかを、高速に調べたいのですが、どのような方法があるでしょうか? 現在以下のことをやっています。 数千件のテキストファイルから特定文字列を検索しています。 検索を高速化するために、テキストファイルをバイナリーモードで1つの変数に読み込み、instr関数で検索しています。 見つかった場合、その位置から前にあるvbCrLfをInStrRev関数で、後ろにあるvbCrLfをinstr関数で位置を調べ、元の変数からmid関数で該当ラインを取り出しています。 検索はこれで可能ですが、特定文字列を調べたinstr関数の戻り値がテキストファイルの先頭からの位置(何桁目)なので、検索した文字列が何行目にあるか分かりません。 変数の検索文字が見つかった位置までの部分でvbCrLfが何個発生しているかが分かれば行数が判定できます。 vbCrLfを調べるinstr関数を何回も繰り返せば行数の判定は可能ですが、もっと高速に(一つの関数・命令で)調べることはできないでしょうか? また他に行数を特定する良い方法があったら教えてください。 よろしくお願い申し上げます。

このQ&Aのポイント
  • Windows10でMFC-650CDのドライバを入手する方法を教えてください。
  • MFC-650CDのドライバをWin10でダウンロードする際、ダウンロードボタンが見つからないというトラブルが発生しています。
  • MFC-650CDのドライバを有線LAN接続の環境で使用する場合、具体的な手順を教えてください。
回答を見る

専門家に質問してみよう