• ベストアンサー
※ 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
質問者

お礼

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