2013-05-25 18 views
5

文字列「Test Case」&のインデックスをtxtファイルで検索する必要があります。VBSスクリプトを使用してテキストファイル内の特定の文字列を検索

私はあなたがこのファイルで見つけることができるラインの例を与える:

<tr><td><a href="../../Login/Log_ in_U1A1">Log_ in_U1A1</a></td></tr> 
<tr><td><a href="../Test case 5 DD/Form1">Form1</a></td></tr> 

あなたは2行目に見ることができるように私は、文字列「テストケース」の発生を持っています。

私がしたいことは、「テストケース5」が現れる行に先行する行に別の特定の文字列を追加することです。たとえば:

<tr><td><a href="../../Login/Log_ in_U1A1">Log_ in_U1A1</a></td></tr> 
<tr><td><a href="../../Logs/DD/Beginning_of_DD_TC5.html">Beginning_of_DD_TC5</a></td></tr> 
<tr><td><a href="../Test case 5 DD/Form1">Form1</a></td></tr> 

それは私が追加行はテストケースの数に依存インデックスiを持っている、と私は「テストケース」&私が最初に出現する前にそれを追加する必要があり、私はいけないことも重要です次のような場合に注意してください。

InStr関数は、一例で働いていた場合、私はテストした:それは私の部分文字列を認識し、

Dim objFSO, filepath, objInputFile, tmpStr, substrToFind 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
filepath = "C:\VBS\filediprova.txt" 
substrToFind = "<tr><td><a href=" & chr(34) & "../Test case 5" 
Set objInputFile = objFSO.OpenTextFile(filepath) 
tmpStr = objInputFile.ReadLine 
If InStr(tmpStr, substrToFind) <= 0 Then 
    WScript.Echo "No matches" 
Else 
    WScript.Echo "Found match" 
End If 

そして、それは動作します。私は同じInStr関数を使用し、私はいくつかの問題を抱えているより多くの行を持つファイルをループしようとすると、今

<tr><td><a href="../Test case 5 DD/Form1">Form1</a></td></tr> 

:この小さな例ではtxtファイルにのみfollowinglineをcontans。

Do until objInputFile.AtEndOfStream 
    strToAdd = "<tr><td><a href=" & chr(34) & "../../Logs/DD/Beginning_of_DD_TC" & CStr(index) & ".html" & chr(34) & ">Beginning_of_DD_TC" & CStr(index) & "</a></td></tr>" 
    substrToFind = "<tr><td><a href=" & chr(34) & "../Test case " & index 
    firstStr = "<?xml version" 'my file always starts like this 
    tmpStr = objInputFile.ReadLine 
    If InStr(tmpStr, substrToFind) <= 0 Then 
     If Instr(tmpStr, firstStr) > 0 Then 
      text = tmpStr 'to avoid the first empty line 
     Else 
      text = text & vbCrLf & tmpStr 
     End If 
    Else 
     text = text & vbCrLf & strToAdd & vbCrLf & tmpStr 
     index = index + 1 
    End If 
Loop 

何が問題になっています: 私は、次のループを書きましたか?

答えて

2

私はこのための代わりの文字列操作の正規表現を使用してお勧めします:

Set fso = CreateObject("Scripting.FileSystemObject") 

filename = "C:\VBS\filediprova.txt" 

newtext = vbLf & "<tr><td><a href=""..."">Beginning_of_DD_TC5</a></td></tr>" 

Set re = New RegExp 
re.Pattern = "(\n.*?Test Case \d)" 
re.Global = False 
re.IgnoreCase = True 

text = f.OpenTextFile(filename).ReadAll 
f.OpenTextFile(filename, 2).Write re.Replace(text, newText & "$1") 

数字が続く文字列Test Caseを含む行に続く改行(\n)に一致する正規表現( \d)、置き換えには挿入するテキストの前に置き換えられます(変数newtext)。 re.Global = Falseを設定すると、最初の一致後に置換が停止します。テキストファイル内の改行がCR-LF(キャリッジリターン+ラインフィード)としてエンコードされている場合

あなたはvbCrLf\r\nvbLf\nを変更する必要があります。

あなたは、いくつかのテキストファイルを変更する必要がある場合、あなたはこのようなループでそれを行うことができます:いくつかの試みの後、次のように変更する

For Each f In fso.GetFolder("C:\VBS").Files 
    If LCase(fso.GetExtensionName(f.Name)) = "txt" Then 
    text = f.OpenAsTextStream.ReadAll 
    f.OpenAsTextStream(2).Write re.Replace(text, newText & "$1") 
    End If 
Next 
+0

を期待していた結果ですが、私はどこから始めるべきかわからなかった、彼らは私にアラム語のように見える!私がJavaとVisual Basicを知っているにもかかわらず、私はそれらを使用して敢えてしなかった。私はこの可能性を考慮していきますが、正規表現についてのチュートリアル(ダミー用)の良いリンクを教えてください。 – Luceye85

+0

[こちら](http://www.codeproject.com/Articles/939/An-Introduction-to-Regular-Expressions)、もちろん[documentation](http://msdn.microsoft.com/en/ -us/library/6wzad2b2)。 –

0

てみてください。..

firstStr = "<?xml version" 'my file always starts like this 

Do until objInputFile.AtEndOfStream 

    strToAdd = "<tr><td><a href=" & chr(34) & "../../Logs/DD/Beginning_of_DD_TC" & CStr(index) & ".html" & chr(34) & ">Beginning_of_DD_TC" & CStr(index) & "</a></td></tr>" 

    substrToFind = "<tr><td><a href=" & chr(34) & "../Test case " & trim(cstr((index))) 

    tmpStr = objInputFile.ReadLine 

    If InStr(tmpStr, substrToFind) <= 0 Then 
     If Instr(tmpStr, firstStr) > 0 Then 
      text = tmpStr 'to avoid the first empty line 
     Else 
      text = text & vbCrLf & tmpStr 
     End If 
    Else 
     text = text & vbCrLf & strToAdd & vbCrLf & tmpStr 

    End If 
    index = index + 1 
Loop 
+0

こんにちはmatzone、私はどのようにダム私は実現してくれてありがとう!私はCInt(インデックス)を書くのを忘れていたことに気付かなかった。スクリプトがこの変更に対応しているかどうかを確認してお知らせします。 – Luceye85

+0

実際に正しい修正はCStr(インデックス)でした。このように動作するかどうかを確認しましたが、そうではありません。何か他の理由があるかもしれません... – Luceye85

+0

私はインデックスが整数varと仮定しました。 – matzone

4

うわー、I最終的にVBで自分のテキストの編集に対処する方法を考え出した。コードは完璧に機能し、私が期待していた結果が得られます。おそらく、これを行うには最良の方法ではありませんが、それはその仕事です。 ここでは、コードです:

Option Explicit 

Dim StdIn: Set StdIn = WScript.StdIn 
Dim StdOut: Set StdOut = WScript 


Main() 

Sub Main() 

Dim objFSO, filepath, objInputFile, tmpStr, ForWriting, ForReading, count, text, objOutputFile, index, TSGlobalPath, foundFirstMatch 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
TSGlobalPath = "C:\VBS\TestSuiteGlobal\Test suite Dispatch Decimal - Global.txt" 
ForReading = 1 
ForWriting = 2 
Set objInputFile = objFSO.OpenTextFile(TSGlobalPath, ForReading, False) 
count = 7 
text="" 
foundFirstMatch = false 

Do until objInputFile.AtEndOfStream 
    tmpStr = objInputFile.ReadLine 
    If foundStrMatch(tmpStr)=true Then 
     If foundFirstMatch = false Then 
      index = getIndex(tmpStr) 
      foundFirstMatch = true 
      text = text & vbCrLf & textSubstitution(tmpStr,index,"true") 
     End If 
     If index = getIndex(tmpStr) Then 
      text = text & vbCrLf & textSubstitution(tmpStr,index,"false") 
     ElseIf index < getIndex(tmpStr) Then 
      index = getIndex(tmpStr) 
      text = text & vbCrLf & textSubstitution(tmpStr,index,"true") 
     End If 
    Else 
     text = text & vbCrLf & textSubstitution(tmpStr,index,"false") 
    End If 
Loop 
Set objOutputFile = objFSO.CreateTextFile("C:\VBS\NuovaProva.txt", ForWriting, true) 
objOutputFile.Write(text) 
End Sub 


Function textSubstitution(tmpStr,index,foundMatch) 
Dim strToAdd 
strToAdd = "<tr><td><a href=" & chr(34) & "../../Logs/CF5.0_Features/Beginning_of_CF5.0_Features_TC" & CStr(index) & ".html" & chr(34) & ">Beginning_of_CF5.0_Features_TC" & CStr(index) & "</a></td></tr>" 
If foundMatch = "false" Then 
    textSubstitution = tmpStr 
ElseIf foundMatch = "true" Then 
    textSubstitution = strToAdd & vbCrLf & tmpStr 
End If 
End Function 


Function getIndex(tmpStr) 
Dim substrToFind, charAtPos, char1, char2 
substrToFind = "<tr><td><a href=" & chr(34) & "../Test case " 
charAtPos = len(substrToFind) + 1 
char1 = Mid(tmpStr, charAtPos, 1) 
char2 = Mid(tmpStr, charAtPos+1, 1) 
If IsNumeric(char2) Then 
    getIndex = CInt(char1 & char2) 
Else 
    getIndex = CInt(char1) 
End If 
End Function 

Function foundStrMatch(tmpStr) 
Dim substrToFind 
substrToFind = "<tr><td><a href=" & chr(34) & "../Test case " 
If InStr(tmpStr, substrToFind) > 0 Then 
    foundStrMatch = true 
Else 
    foundStrMatch = false 
End If 
End Function 

これは

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <meta content="text/html; charset=UTF-8" http-equiv="content-type" /> 
    <title>Test Suite</title> 
</head> 
<body> 
<table id="suiteTable" cellpadding="1" cellspacing="1" border="1" class="selenium"><tbody> 
<tr><td><b>Test Suite</b></td></tr> 
<tr><td><a href="../../Component/TC_Environment_setting">TC_Environment_setting</a></td></tr> 
<tr><td><a href="../../Component/TC_Set_variables">TC_Set_variables</a></td></tr> 
<tr><td><a href="../../Component/TC_Set_ID">TC_Set_ID</a></td></tr> 
<tr><td><a href="../../Login/Log_in_Admin">Log_in_Admin</a></td></tr> 
<tr><td><a href="../../Component/Set_Roles_Dispatch_Decimal">Set_Roles_Dispatch_Decimal</a></td></tr> 
<tr><td><a href="../../Login/Log_ in_U1A1">Log_ in_U1A1</a></td></tr> 
<tr><td><a href="../Test case 5 DD/Form1">Form1</a></td></tr> 
<tr><td><a href="../Test case 5 DD/contrD1">contrD1</a></td></tr> 
<tr><td><a href="../../Login/Logout">Logout</a></td></tr> 
<tr><td><a href="../../Login/Log_ in_U1B1">Log_ in_U1B1</a></td></tr> 
<tr><td><a href="../../Component/Search&OpenApp">Search&OpenApp</a></td></tr> 
<tr><td><a href="../Test case 5 DD/FormEND">FormEND</a></td></tr> 
<tr><td><a href="../../Component/Controllo END">Controllo END</a></td></tr> 
<tr><td><a href="../../Login/Logout">Logout</a></td></tr> 
<tr><td><a href="../../Login/Log_ in_U1A1">Log_ in_U1A1</a></td></tr> 
<tr><td><a href="../Test case 6 DD/Form1">Form1</a></td></tr> 
<tr><td><a href="../Test case 6 DD/contrD1">contrD1</a></td></tr> 
<tr><td><a href="../../Login/Logout">Logout</a></td></tr> 
<tr><td><a href="../../Login/Log_ in_U1B1">Log_ in_U1B1</a></td></tr> 
<tr><td><a href="../../Component/Search&OpenApp">Search&OpenApp</a></td></tr> 
<tr><td><a href="../Test case 5 DD/FormEND">FormEND</a></td></tr> 
<tr><td><a href="../../Component/Controllo END">Controllo END</a></td></tr> 
<tr><td><a href="../../Login/Logout">Logout</a></td></tr> 
<tr><td><a href="../../Login/Log_ in_U1A1">Log_ in_U1A1</a></td></tr> 
<tr><td><a href="../Test case 7 DD/Form1">Form1</a></td></tr> 
<tr><td><a href="../../Component/Controllo DeadLetter">Controllo DeadLetter</a></td></tr> 
<tr><td><a href="../../Login/Logout">Logout</a></td></tr> 
<tr><td><a href="../../Component/Set_Roles_Dispatch_Decimal">Set_Roles_Dispatch_Decimal</a></td></tr> 
<tr><td><a href="../../Login/Logout_BAC">Logout_BAC</a></td></tr> 
</tbody></table> 
</body> 
</html> 

元txtファイルであり、これは、私はまた、REG式を使用して考えていた

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <meta content="text/html; charset=UTF-8" http-equiv="content-type" /> 
    <title>Test Suite</title> 
</head> 
<body> 
<table id="suiteTable" cellpadding="1" cellspacing="1" border="1" class="selenium"><tbody> 
<tr><td><b>Test Suite</b></td></tr> 
<tr><td><a href="../../Component/TC_Environment_setting">TC_Environment_setting</a></td></tr> 
<tr><td><a href="../../Component/TC_Set_variables">TC_Set_variables</a></td></tr> 
<tr><td><a href="../../Component/TC_Set_ID">TC_Set_ID</a></td></tr> 
<tr><td><a href="../../Login/Log_in_Admin">Log_in_Admin</a></td></tr> 
<tr><td><a href="../../Component/Set_Roles_Dispatch_Decimal">Set_Roles_Dispatch_Decimal</a></td></tr> 
<tr><td><a href="../../Login/Log_ in_U1A1">Log_ in_U1A1</a></td></tr> 
<tr><td><a href="../../Logs/CF5.0_Features/Beginning_of_CF5.0_Features_TC5.html">Beginning_of_CF5.0_Features_TC5</a></td></tr> 
<tr><td><a href="../Test case 5 DD/Form1">Form1</a></td></tr> 
<tr><td><a href="../Test case 5 DD/Form1">Form1</a></td></tr> 
<tr><td><a href="../Test case 5 DD/contrD1">contrD1</a></td></tr> 
<tr><td><a href="../../Login/Logout">Logout</a></td></tr> 
<tr><td><a href="../../Login/Log_ in_U1B1">Log_ in_U1B1</a></td></tr> 
<tr><td><a href="../../Component/Search&OpenApp">Search&OpenApp</a></td></tr> 
<tr><td><a href="../Test case 5 DD/FormEND">FormEND</a></td></tr> 
<tr><td><a href="../../Component/Controllo END">Controllo END</a></td></tr> 
<tr><td><a href="../../Login/Logout">Logout</a></td></tr> 
<tr><td><a href="../../Login/Log_ in_U1A1">Log_ in_U1A1</a></td></tr> 
<tr><td><a href="../../Logs/CF5.0_Features/Beginning_of_CF5.0_Features_TC6.html">Beginning_of_CF5.0_Features_TC6</a></td></tr> 
<tr><td><a href="../Test case 6 DD/Form1">Form1</a></td></tr> 
<tr><td><a href="../Test case 6 DD/contrD1">contrD1</a></td></tr> 
<tr><td><a href="../../Login/Logout">Logout</a></td></tr> 
<tr><td><a href="../../Login/Log_ in_U1B1">Log_ in_U1B1</a></td></tr> 
<tr><td><a href="../../Component/Search&OpenApp">Search&OpenApp</a></td></tr> 
<tr><td><a href="../../Component/Controllo END">Controllo END</a></td></tr> 
<tr><td><a href="../../Login/Logout">Logout</a></td></tr> 
<tr><td><a href="../../Login/Log_ in_U1A1">Log_ in_U1A1</a></td></tr> 
<tr><td><a href="../../Logs/CF5.0_Features/Beginning_of_CF5.0_Features_TC7.html">Beginning_of_CF5.0_Features_TC7</a></td></tr> 
<tr><td><a href="../Test case 7 DD/Form1">Form1</a></td></tr> 
<tr><td><a href="../../Component/Controllo DeadLetter">Controllo DeadLetter</a></td></tr> 
<tr><td><a href="../../Login/Logout">Logout</a></td></tr> 
<tr><td><a href="../../Component/Set_Roles_Dispatch_Decimal">Set_Roles_Dispatch_Decimal</a></td></tr> 
<tr><td><a href="../../Login/Logout_BAC">Logout_BAC</a></td></tr> 
</tbody></table> 
</body> 
</html> 
+0

これは元のテキストです – Luceye85

関連する問題