如果你將整個文件讀入行的數組你會使用相同的方法或多或少除去開頭或結尾線。
filename = "C:\path\to\your.txt"
numLinesToRemove = 10
Set fso = CreateObject("Scripting.FileSystemObject")
txt = Split(fso.OpenTextFile(filename).ReadAll, vbNewLine)
Set f = fso.OpenTextFile(filename, 2)
For i = numLinesToRemove To UBound(txt)
f.WriteLine txt(i)
Next
f.Close
要你,你要刪除的行之前停止文件的結尾處,刪除線:
爲了從您要刪除您開始在該行抵銷後的開頭刪除線
filename = "C:\path\to\your.txt"
numLinesToRemove = 10
Set fso = CreateObject("Scripting.FileSystemObject")
txt = Split(fso.OpenTextFile(filename).ReadAll, vbNewLine)
Set f = fso.OpenTextFile(filename, 2)
For i = 0 To UBound(txt) - numLinesToRemove
f.WriteLine txt(i)
Next
f.Close
雖然這種方法只適用於小文件。如果您需要處理大文件,通常無法將整個文件讀入內存。如果你的計算機開始將數據從內存交換到磁盤,導致系統放慢爬行速度。爲避免這種情況,您通常在循環中逐行讀取文件並寫入臨時文件,然後在處理完成後用temp文件替換原始文件。從文件的開頭
刪除線仍然是相當瑣碎,因爲TextStream
對象都有一個Line
屬性,保存當前的行號(即,未來ReadLine
調用將讀取的行數)。
Set f = fso.OpenTextFile(filename)
Set tmp = fso.OpenTextFile(filename & ".tmp", 2, True)
Do Until f.AtEndOfStream
If f.Line <= numLinesToRemove Then
f.SkipLine
Else
tmp.WriteLine f.ReadLine
End If
Loop
f.Close
tmp.Close
但是,您不能這樣做從文件末尾刪除行,因爲您不知道行數是多少。處理這種情況的一種方法是創建要刪除的行數的大小,在從輸入文件讀取行時填充它,並在從緩衝區中刪除行時將行寫入輸出文件。這樣,當循環終止時,最後的numLinesToRemove
行仍然在緩衝區中(不寫入輸出文件)。
ReDim buf(numLinesToRemove) 'ring buffer
i = -1 'ring buffer pointer
Set f = fso.OpenTextFile(filename)
Set tmp = fso.OpenTextFile(filename & ".tmp", 2, True)
Do Until f.AtEndOfStream
i = (i + 1) Mod numLinesToRemove 'advance ring buffer pointer
'if current buffer slot is filled write it to the output file ...
If Not IsEmpty(buf(i)) Then tmp.WriteLine buf(i)
'... then put current line from input file into current buffer slot
buf(i) = f.ReadLine
Next
f.Close
tmp.Close
在這兩種情況下,您都會在處理完成後替換原始文件,例如,像這樣:
fso.DeleteFile filename
fso.MoveFile filename & ".tmp", filename
謝謝Ansgar,這個文件不是那麼大。我用了第一個。 – Paul