2013-10-15 15 views
6

Sto cercando di utilizzare i metodi FileSystemObject per trovare una riga specifica in un file di testo e all'interno di tale riga sostituire una stringa specifica. Sono relativamente nuovo a questo, come il mio codice attuale ha eccellere aprire il file di testo e sostituire quello che mi serve per sostituire, quindi salvarlo e chiuderlo. In questo modo non è più un'opzione, poiché avendo Excel aperto il file di testo impiega troppo tempo e mantiene il file.Come sostituire una stringa in una riga di un file di testo utilizzando FileSystemObject in VBA?

Questo è quanto sono arrivato così lontano.

-

Sub FindLines() 

Const ForReading = 1 

Set FSO = CreateObject("Scripting.FileSystemObject") 

Set objFSO = FSO.OpenTextFile("C:\Users\Carella Home\Desktop\boomboom.txt", ForReading,  False) 

Do Until objFSO.AtEndOfStream = True 

    go = objFSO.ReadLine 

    If InStr(1, go, "ant", vbTextCompare) > 0 Then 

     bo = Replace(go, "t", "wow") 

    End If 

Loop 

objFSO.Close 

Set objFSO = FSO.OpenTextFile("C:\Users\Carella Home\Desktop\boomboom.txt", 2) 

End Sub 

-

Il meglio che posso fare è aprire il file fino a scrivere, ma non ho idea di come trovare la linea e sostituirlo con la linea che ho bisogno di sostituirlo con.

Per favore fatemi sapere se, nel caso in cui siete disposti ad aiutarmi/guidarmi nella direzione corretta, avete bisogno di maggiori informazioni. Ho cercato molto e ho visto persone suggerire altri modi per farlo. Ho bisogno di imparare come modificare le righe in questo modo. Qualcuno può aiutarmi?

Grazie in anticipo!

-Anthony C.

+0

Per curiosità, perché Excel e non parola o qualche altro lettore di testo? –

+0

Stavo usando Excel perché è quello che mi è stato insegnato originariamente. Il codice VBA si trova in un file utilizzato da molti utenti, quindi dopo aver letto/scritto 10 di queste applicazioni nello stesso file aprendo/chiudendo Excel era troppo e causando troppi errori. Ho bisogno di qualcosa di più veloce dell'apertura e chiusura del file. – aCarella

risposta

9

Non sono sicuro se questo è il metodo più efficiente, ma una sola idea sarebbe quella di utilizzare il metodo del FileSystemObjectCreateTextFile, per creare un altro file è possibile scrivere a.

L'ho provato su un file piccolo e sembra funzionare come previsto.

modificato dopo la risposta accettato per evitare .ReadLine e .WriteLine loop

Sub FindLines() 
'Declare ALL of your variables :) 
Const ForReading = 1 ' 
Const fileToRead As String = "C:\Users\david_zemens\Desktop\test.txt" ' the path of the file to read 
Const fileToWrite As String = "C:\Users\david_zemens\Desktop\test_NEW.txt" ' the path of a new file 
Dim FSO As Object 
Dim readFile As Object 'the file you will READ 
Dim writeFile As Object 'the file you will CREATE 
Dim repLine As Variant 'the array of lines you will WRITE 
Dim ln As Variant 
Dim l As Long 

Set FSO = CreateObject("Scripting.FileSystemObject") 
Set readFile = FSO.OpenTextFile(fileToRead, ForReading, False) 
Set writeFile = FSO.CreateTextFile(fileToWrite, True, False) 

'# Read entire file into an array & close it 
repLine = Split(readFile.ReadAll, vbNewLine) 
readFile.Close 

'# iterate the array and do the replacement line by line 
For Each ln In repLine 
    ln = IIf(InStr(1, ln, "ant", vbTextCompare) > 0, Replace(ln, "t", "wow"), ln) 
    repLine(l) = ln 
    l = l + 1 
Next 

'# Write to the array items to the file 
writeFile.Write Join(repLine, vbNewLine) 
writeFile.Close 

'# clean up 
Set readFile = Nothing 
Set writeFile = Nothing 
Set FSO = Nothing 

End Sub 

Poi, a seconda se si vuole sbarazzarsi della "originale" il file si potrebbe fare qualcosa di simile:

'# clean up 
Set readFile = Nothing 
Set writeFile = Nothing 
'# Get rid of the "old" file and replace/rename it with only the new one 
Kill fileToRead 
Name fileToWrite As fileToRead 
End Sub 
+0

+ 1 ben fatto :) –

+0

Grazie mille. Ho visto questo usato prima ma non è mai stato spiegato chiaramente a me. Sicuramente lo proverò e pubblicherò i miei risultati. – aCarella

+0

Ho appena provato questo e ha funzionato perfettamente. Grazie mille. – aCarella

5

Ecco un metodo molto più veloce e più breve rispetto allo FileSystemObject

Sub Sample() 
    Dim MyData As String, strData() As String 

    '~~> Read the file in one go! 
    Open "C:\Users\Carella Home\Desktop\boomboom.txt" For Binary As #1 
    MyData = Space$(LOF(1)) 
    Get #1, , MyData 
    Close #1 
    strData() = Split(MyData, vbCrLf) 
End Sub 

Tutti i dati file di testo è ora nella matrice strData Semplicemente ciclo anche se la matrice e trovato il testo che si desidera sostituire e scrivere di nuovo allo stesso file .

+0

Ho visto prima questo metodo e ho suggerito di riferirmi ai file attraverso filesystemobject, ma non è mai stato spiegato. Cercherò la sintassi e vedrò quanto posso raccogliere. Essendo che ho già aggiunto i miei file tramite filesystemobject, ho pensato che fosse il modo migliore di usarlo per modificare anche i file. Lo esaminerò. Grazie per la risposta. – aCarella

+0

Non ho familiarità con questo. Non ho nulla a cui riferire quando provo questo metodo. Sono, tuttavia, curioso di sapere perché questo sarebbe più efficiente. Come si chiama? Potresti indicarmi la direzione giusta su ciò che cercherò per imparare come usare tutto ciò che hai digitato nella tua risposta? Grazie! – aCarella

+2

La ragione è molto semplice. Questo metodo è più veloce perché non esegui il ciclo su tutte le righe del file di testo. Quello che stai facendo è caricare il file di testo completo nella matrice (in memoria) in una volta sola e quindi eseguire le operazioni su quella matrice. –

Problemi correlati