I am trying to use FileSystemObject methods to find a specific line in a text file, and within that line replace a specific string. I am relatively new to this, as my current code has excel open the text file and replace what I need it to replace then save and close it. This way is no longer an option, as having excel open the text file takes too long and holds up the file.
This is how far I have gotten so far.
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
The best I can do is open the file up to write, but I have no idea how to find the line and replace it with the line that I need to replace it with.
Please let me know if, in the event that you are willing to help/guide me in the correct direction, you need more information. I have searched a lot and have seen people suggest other ways of doing this. I need to learn how to edit lines this way. Can someone please help me?
Thanks in advance!
Not sure if this is the most efficient method but one idea would be to use the CreateTextFile method of the
FileSystemObject, to create another file you can write to.
I’ve tested this on a small file and appears to be working as expected.
Modified after answer accepted to avoid
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
Then, depending on whether you want to get rid of the “original” file you could do something like:
'# 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
Here is a much faster and shorter method as compared to the
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
All your text file data is now in the array
strData Simply loop though the array and find the text that you want to replace and write it back to the SAME file.