2014-05-20 9 views
5

Ho un file di testo con il seguente testoSostituire tutto il testo in file di testo utilizzando un'espressione regolare

 
161624.406 : Send:[sometext1] 
161624.437 : Send:[sometext2] 
161624.468 : Send:[sometext3] 
161624.499 : Send:[sometext4] 
161624.531 : Send:[sometext5] 

voglio tenere solo la someText parte in quel file. output desiderato è

 
sometext1 
sometext2 
sometext3 
sometext4 
sometext5 

Sto usando il seguente codice in Excel-VBA

Public Sub testa() 
    a = "C:\Users\pankaj.jaju\Desktop\test.log" 

    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    Set objTxtFile = objFSO.OpenTextFile(a, 1) 
    strText = objTxtFile.ReadAll 
    objTxtFile.Close 
    Set objTxtFile = Nothing 


    Set objRegEx = CreateObject("VBScript.RegExp") 
    With objRegEx 
     .Global = True 
     .MultiLine = True 
     .Pattern = "\[([^]]+)\]" 
     Set objRegMC = .Execute(strText) 
     b = objRegMC(0).SubMatches(0) 
    End With 
    Set objRegEx = Nothing 

    Debug.Print b 
End Sub 

Il problema è che l'output viene visualizzato come solo sometext1. Come faccio a ReplaceAll nel file di testo e salvo il file con il solo testo desiderato.

+0

Suppongo che sia corretto eliminare il file in modo sostanziale e ricrearlo o è necessario che funzioni sullo stesso file? –

+0

Questa non è una cosa fondamentale ... Posso fare sia –

+0

Per quelli meno legati alla regex da testo a colonne può essere molto più conveniente. – pnuts

risposta

3

Il metodo regex.Replace dovrebbe fare il trucco.

separato il vostro modello in gruppi come questo: "(.*?)(\[)([^]]+)(\])(.*?)"

E ora si può sostituire la stringa di input con il gruppo di corrispondenza che è di tre gruppi, in questo caso: objRegEx.Replace(strText, "$3")


Ecco un helpful link a diversi esempi di Regex in Excel.

0

La regex ovviamente acquisisce solo la prima corrispondenza della stringa. Non sono abbastanza competente con regex a venire con una regex unica soluzione che tenga conto \n

Una soluzione semplice sarebbe quella di utilizzare objTxtFile.ReadLine invece di ReadAll

Read ogni stringa in uno per uno, applicare regex e ottieni risultati.

Public Sub testa() 
    a = "C:\Users\pankaj.jaju\Desktop\test.log" 

    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    Set objTxtFile = objFSO.OpenTextFile(a, 1) 

    Do Until (objTxtFile.AtEndOfStream) 'Loop till EOF 
     strText = objTxtFile.ReadLine 'Single line read instead of ReadAll 

     Set objRegex = CreateObject("VBScript.RegExp") 
     With objRegex 
      .Global = True 
      .MultiLine = True 
      .Pattern = "\[([^]]+)\]" 
      Set objRegMC = .Execute(strText) 
      b = objRegMC(0).SubMatches(0) 
     End With 
     Set objRegex = Nothing 

     Debug.Print b 'replace this with the code to output the string where you want etc 
    Loop 
    objTxtFile.Close 
End Sub 
+0

Grazie per questo, ma ho trovato un modo più veloce per farlo. –

+1

Provate ad impostare la vostra linea di testo con questo: 'objRegEx.Replace (strText," ")' e quindi non avrete bisogno di 'objRegMC'. Ecco un [collegamento] (http: // StackOverflow.it/q/22542834/2521004) che ha un esempio di sostituzione della cella excel originale usando regex che è simile. –

+0

@PortlandRunner - Utilizzando Sostituisci, ho finito per sostituire la sottostringa richiesta. –

0

OK ... trovato un modo per farlo (Grazie MSDN ... a volte i documenti sono utili :-)). Condividere la risposta

Public Sub testa() 
    a = "C:\Users\pankaj.jaju\Desktop\test.log" 

    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    Set objTxtFile = objFSO.OpenTextFile(a, 1) 
    strText = objTxtFile.ReadAll 
    objTxtFile.Close 
    Set objTxtFile = Nothing 

    b = "" 
    Set objRegEx = CreateObject("VBScript.RegExp") 
    With objRegEx 
     .Global = True 
     .MultiLine = True 
     .Pattern = "\[([^]]+)\]" 
     Set objMatches = .Execute(strText) 

     For Each Match In objMatches 
      For Each SubMatch In Match.SubMatches 
       b = b & SubMatch & vbCrLf 
      Next SubMatch 
     Next Match 

    End With 
    Set objRegEx = Nothing 

    Set objTxtFile = objFSO.OpenTextFile(a, 2) 
    objTxtFile.Write b 
    objTxtFile.Close 
    Set objTxtFile = Nothing 
End Sub 


EDIT - Sulla base di @ PortlandRunner suggerimento

Public Sub testa() 
a = "C:\Users\pankaj.jaju\Desktop\test.log" 

Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objTxtFile = objFSO.OpenTextFile(a, 1) 
strText = objTxtFile.ReadAll 
objTxtFile.Close 
Set objTxtFile = Nothing 

b = "" 
Set objRegEx = CreateObject("VBScript.RegExp") 
With objRegEx 
    .Global = True 
    .MultiLine = True 
    .Pattern = "(.*?)(\[)([^]]+)(\])(.*?)" 
    b = objRegEx.Replace(strText, "$3") 
End With 
Set objRegEx = Nothing 

Set objTxtFile = objFSO.OpenTextFile(a, 2) 
objTxtFile.Write b 
objTxtFile.Close 
Set objTxtFile = Nothing 
End Sub 
2

So che hai già la tua risposta. Ma per un programma semplice come questo, perché utilizzare anche le espressioni regolari? Ecco uno script di 4 righe in grado di fare la stessa cosa - sì è stato testato.

Dim a, text: a = "C:\testenv\test.log" 
text = split(CreateObject("Scripting.FileSystemObject").OpenTextFile(a, 1).ReadAll, vbcrlf) 
for i=0 to ubound(text) : text(i) = replace(split(text(i), "[")(1), "]", "") : next 
CreateObject("Scripting.FileSystemObject").OpenTextFile(a, 2).Write(Join(text, vbcrlf)) 
+0

Personalmente vorrei espandere questo per essere più leggibile quindi è più facile da capire, mantenere e imparare da Oltre a questo, 1 semplice soluzione semplice per il formato di testo fornito da OP. –

+0

@PortlandRunner Grazie amico! :) Devo ammettere, ho trovato alcuni formati piuttosto inusuali per manipolare il testo a causa del fatto che le espressioni regolari possono farmi pulsare il cervello. – Rich

+0

@Rich - Bello .... ma volevo usare espressioni regolari in quanto il mio problema reale è un po 'complesso. Ho pubblicato il mio codice di test e dati per ottenere alcune informazioni dalla community SO. –