2013-10-15 4 views
6

Ich versuche, FileSystemObject-Methoden zu verwenden, um eine bestimmte Zeile in einer Textdatei zu finden und innerhalb dieser Zeile eine bestimmte Zeichenfolge zu ersetzen. Ich bin relativ neu dazu, wie mein aktueller Code Excel hat, öffne die Textdatei und ersetze, was ich es ersetzen muss, dann speichere und schließe es. Dieser Weg ist nicht länger eine Option, da Excel die Textdatei öffnen dauert zu lange und hält die Datei.Wie ersetze ich einen String in einer Zeile einer Textdatei mit FileSystemObject in VBA?

Das ist, wie weit ich bisher gekommen bin.

-

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 

-

Das Beste, was ich offen tun kann, ist die Datei zu schreiben, aber ich habe keine Ahnung, wie die Linie zu finden und ersetzen Sie es mit der Zeile, die ich brauche, um Ersetzen Sie es durch.

Bitte lassen Sie mich wissen, wenn Sie bereit sind, mir in die richtige Richtung zu helfen, benötigen Sie weitere Informationen. Ich habe viel gesucht und Leute gesehen, die andere Wege vorgeschlagen haben, dies zu tun. Ich muss lernen, wie man Linien auf diese Weise bearbeitet. Kann mir bitte jemand helfen?

Vielen Dank im Voraus!

-Anthony C.

+0

Aus Neugier, warum Excel und nicht Wort oder ein anderer Textleser? –

+0

Ich benutzte Excel, weil das ist, was mir ursprünglich beigebracht wurde. Der VBA-Code befindet sich in einer Datei, die von vielen Benutzern verwendet wird. Nach dem Lesen von 10 dieser Anwendungen war das Lesen/Schreiben in dieselbe Datei durch Öffnen/Schließen von Excel zu viel und verursachte zu viele Fehler. Ich brauche etwas schneller als das Öffnen und Schließen der Datei. – aCarella

Antwort

9

nicht sicher, ob dies die effizienteste Methode ist nur eine Idee, die CreateTextFile Methode des FileSystemObject zu verwenden wäre, eine andere Datei zu erstellen, die Sie schreiben können.

Ich habe dies in einer kleinen Datei getestet und scheint wie erwartet zu funktionieren.

Modifizierte nach Antwort akzeptiert .ReadLine und .WriteLine Schleifen

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 

Dann zu vermeiden, je nachdem, ob Sie von dem „Original“, um loszuwerden Datei, die Sie tun könnten so etwas wie:

'# 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 schön gemacht :) –

+0

Vielen Dank. Ich habe das schon mal gesehen aber es wurde mir nie klar erklärt. Ich werde das definitiv ausprobieren und meine Ergebnisse veröffentlichen. – aCarella

+0

Ich habe es gerade getestet und es hat perfekt funktioniert. Ich danke dir sehr. – aCarella

5

Hier ist eine viel schnellere und kürzere Methode als die 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 

Alle Textdatei Daten ist jetzt im Array strData einfach Schleife obwohl das Array und finden Sie den Text, den Sie wollen, sie ersetzen und schreiben zurück zum SAME Datei.

+0

Ich habe gesehen, diese Methode vor und vorgeschlagen, über Dateien auf Dateisystemobjekt verweisen, aber es wurde nie erklärt. Ich werde die Syntax nachschlagen und sehen, wie viel ich aufheben kann. Da ich meine Dateien bereits über Dateisystemobjekte angehängt habe, kam ich zu dem Schluss, dass dies auch der bessere Weg ist, um die Dateien zu bearbeiten. Ich werde es mir ansehen. Danke für die Antwort. – aCarella

+0

Ich bin damit nicht vertraut. Ich habe nichts zu erwähnen, wenn ich diese Methode ausprobiere. Ich bin jedoch neugierig, warum dies effizienter wäre. Wie heißt das? Könnten Sie mir in die richtige Richtung zeigen, was ich suchen würde, um zu lernen, wie Sie alles verwenden können, was Sie in Ihre Antwort eingegeben haben? Vielen Dank! – aCarella

+2

Der Grund ist sehr einfach. Diese Methode ist schneller, da Sie nicht jede Zeile der Textdatei durchlaufen. Sie laden nun die komplette Textdatei im Array (in den Speicher) auf einmal und führen dann die Operationen für dieses Array aus. –

Verwandte Themen