2013-05-25 6 views
5

Ho bisogno di trovare la stringa "Test Case" & indice in un file txt.Trova stringa specifica in un file di testo con script VBS

Vi do un esempio delle linee si possono trovare in questo file:

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

Come si può vedere nella seconda riga ho un'occorrenza della stringa "Test Case".

Quello che voglio fare è aggiungere un'altra stringa particolare nella riga che precede quella in cui appare "Test Case 5". Per esempio:

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

E 'anche importante che la linea aggiungo ha un indice i che dipende dal numero di Test Case, e ho bisogno di aggiungere che prima della prima occorrenza di "Test Case" & i, io non preoccuparsi dei seguenti eventi.

ho provato se la funzione InStr ha lavorato con un esempio:

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 

e funziona, riconosce la mia stringa. In questo piccolo esempio il file txt contans solo il followingline:

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

Ora, quando provo ad anello su un file con molta più linee ho qualche problema, io uso la stessa funzione InStr. ho scritto il seguente ciclo:

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 

Cosa c'è di sbagliato?

risposta

2

Mi consiglia di utilizzare un regolare espressioni invece di operazioni sulle stringhe per questo:

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") 

L'espressione regolare corrisponderà un avanzamento riga (\n) seguito da una linea contenente la stringa Test Case seguito da un numero (\d) e la sostituzione verrà anteposta a quella con il testo che si desidera inserire (variabile newtext). L'impostazione re.Global = False interrompe la sostituzione dopo la prima corrispondenza.

Se le interruzioni di riga nel file di testo sono codificati come CR-LF (ritorno a capo + avanzamento riga) dovrete cambiare \n in \r\n e vbLf in vbCrLf.

Se si dispone di modificare diversi file di testo, si potrebbe fare in un ciclo come questo:

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

stavo anche pensando di usare espressioni Reg, ma Non sapevo da dove cominciare, mi sembrano aramaici! Anche se conosco java e visual basic non ho mai osato usarli. Terrò in considerazione questa possibilità, ma puoi darmi un buon link per un tutorial (per i manichini) sulla regex? – Luceye85

+0

Prova [questo] (http://www.codeproject.com/Articles/939/An-Introduction-to-Regular-Expressions) e, naturalmente, la [documentazione] (http://msdn.microsoft.com/en -us/library/6wzad2b2). –

0

tenta di modificare in questo modo ..

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

Ciao matzone, grazie per avermi fatto capire quanto fossi stupido !! Non mi ero reso conto di aver dimenticato di scrivere CInt (indice). Controllerò se lo script funzionerà con questa modifica e ti faccio sapere. – Luceye85

+0

In verità la modifica corretta era CStr (indice), ho controllato se funziona così, ma non è così. Potrebbero esserci altri motivi per cui ... – Luceye85

+0

Forse il problema è il ciclo – Luceye85

4

Wow, dopo alcuni tentativi ho finalmente capito come gestire le mie modifiche di testo in vbs. Il codice funziona perfettamente, mi dà il risultato che mi aspettavo. Forse non è il modo migliore per farlo, ma fa il suo lavoro. Ecco il codice:

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 

Questo è il file txt originale

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

E questo è il risultato mi aspetto

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

Questo è il testo originale – Luceye85