2016-08-12 103 views
1

我得到了這個代碼,刪除了從頂部開始的10行。 是否可以做到這一點,但開始刪除從底部到頂部的TXT文件?刪除從底部開始的行

所以如果我有30行,我想最後10或20行被刪除。

Const FOR_READING = 1 
Const FOR_WRITING = 2 
strFileName = "C:\scripts\delete.txt" 
iNumberOfLinesToDelete = 10 

Set objFS = CreateObject("Scripting.FileSystemObject") 
Set objTS = objFS.OpenTextFile(strFileName, FOR_READING) 
strContents = objTS.ReadAll 
objTS.Close 

arrLines = Split(strContents, vbNewLine) 
Set objTS = objFS.OpenTextFile(strFileName, FOR_WRITING) 

For i=0 To UBound(arrLines) 
    If i > (iNumberOfLinesToDelete - 1) Then 
     objTS.WriteLine arrLines(i) 
    End If 
Next 

回答

0

如果你將整個文件讀入行的數組你會使用相同的方法或多或少除去開頭或結尾線。

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 
+0

謝謝Ansgar,這個文件不是那麼大。我用了第一個。 – Paul

0

只是循環向後你的發言

For i=UBound(arrLines) To (UBound(arrLines) -10) step -1 

Next 
+0

您的循環向後遍歷最後10個數組項。 OP想要將除最後10行之外的所有內容寫回輸出文件。 –