2013-10-15 9 views
6

Bir metin dosyasında belirli bir satırı bulmak için FileSystemObject yöntemlerini kullanmaya çalışıyorum ve bu satır içinde belirli bir dizeyi değiştirin. Mevcut kodum metin dosyasını açıp değiştirmek için ihtiyacım olan şeyi değiştirip kaydedip kapatabildiğimden, buna nispeten yeniyim. Bu şekilde artık bir seçenek yok, çünkü excel açıkken metin dosyası çok uzun sürüyor ve dosyayı tutuyor.VBA'da FileSystemObject Kullanarak Metin Dosyalarının Bir Satırındaki Bir Dizeyi Nasıl Değiştiririm?

Şimdiye kadar ne kadar uzağa gittim.

-

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 

-

Yapabileceğim en iyi yazma kadar dosya açık olduğunu, ama nasıl çizgiyi bulmak ve ben gerek çizgi ile değiştirmek için hiçbir fikrim yok ile değiştirin.

Lütfen bana, doğru yönde yardım/yol göstermeye istekli olmanız halinde daha fazla bilgiye ihtiyacınız varsa bildirin. Çok araştırdım ve insanların bunu yapmanın başka yollarını önerdiklerini gördüm. Çizgileri bu şekilde nasıl değiştireceğimi öğrenmem gerek. Birisi bana yardım edebilir mi?

Şimdiden teşekkürler!

-Anthony C.

+0

Merak etme, neden kelime veya başka bir metin okuyucusu değil excel? –

+0

Excel kullanıyordum çünkü bu bana orijinal olarak öğretildi. VBA kodu, birçok kullanıcı tarafından kullanılan bir dosyadadır, bu nedenle 10'u bu uygulamaların/dosyaların excel açılarak/kapatılarak aynı dosyaya yazılması/yazılması çok fazla hataya neden oldu. Dosyayı açıp kapatmaktan daha hızlı bir şeye ihtiyacım var. – aCarella

cevap

9

bu en etkili yöntemdir ama bir fikir yazabilir başka bir dosya oluşturmak için, FileSystemObject arasında CreateTextFile yöntemi kullanmak olacaktır emin değilim.

Bunu küçük bir dosyada denedim ve beklendiği gibi çalışıyor gibi görünüyor.

cevabı siz "orijinal" kurtulmak isteyip bağlı Sonra .ReadLine ve .WriteLine döngüler

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 

önlemek için kabul etmesinin ardından Yapabileceğin dosya Modifiye gibi bir şey:

'# 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 güzel bitti :) –

+0

Çok teşekkür ederim. Bunu daha önce de görmüştüm ama bana açık bir şekilde açıklanmadı. Kesinlikle bunu deneyeceğim ve sonuçlarımı yazıyorum. – aCarella

+0

Sadece bunu test ettim ve mükemmel çalıştı. Çok teşekkür ederim. – aCarella

5

Burada, FileSystemObject

ile karşılaştırıldığında çok daha hızlı ve daha kısa bir yöntem var.
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 

Tüm metin dosyası veri dizisi olsa dizi strData Basitçe döngüde şimdi ve sen değiştirip geri AYNI dosyaya yazmak istediğiniz metni bulun.

+0

Daha önce bu yöntemi kullandım ve filesystemobject yoluyla dosyalara başvurmayı önerdim, ama asla açıklanmadı. Sözdizimi arayacağım ve ne kadar alabileceğimi göreceğim. Dosyalarımı dosya sistemi aracılığıyla eklediğimden, dosyaları düzenlemek için kullanmanın daha iyi bir yol olduğunu düşündüm. Ben ona bakacağım. Cevap için teşekkürler. – aCarella

+0

Buna aşina değilim. Bu yöntemi denerken başvurmak için hiçbir şeyim yok. Bununla birlikte, bunun neden daha verimli olacağını merak ediyorum. Bu ne denir? Cevabınızda yazdığınız her şeyi nasıl kullanacağımı öğrenmek için ne arayacağımı sorabilir miyim? Teşekkür ederim! – aCarella

+2

Nedeni çok basit. Bu yöntem daha hızlıdır, çünkü metin dosyasının her satırında döngü yapmıyorsunuzdur. Yaptığınız şey bir seferde dizideki tam metin dosyasını (belleğe) yüklüyor ve daha sonra bu dizideki işlemleri gerçekleştirmektir. –

İlgili konular