删除从底部开始的行

删除从底部开始的行

问题描述:

我得到了这个代码,删除了从顶部开始的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 

如果你将整个文件读入行的数组你会使用相同的方法或多或少除去开头或结尾线。

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

只是循环向后你的发言

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

Next 
+0

您的循环向后遍历最后10个数组项。 OP想要将除最后10行之外的所有内容写回输出文件。 –