2016-07-21 96 views
3

我有一个简单的脚本,删除文本文件的前n行。 如何根据行号删除(删除)文本文件的特定行?

Const FOR_READING = 1 
Const FOR_WRITING = 2 
strFileName = "C:\scripts\test.txt" 
iNumberOfLinesToDelete = 5 

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 

我想问一下,如果有一种方法,如果你只需要在文本文件中,你只需要删除特定行?含义基于文本文件的行号

例如,

1 
2 
This is line 3 
4 
5 

而且要删除的行号3。具体行号3

结果:

1 
2 
4 
5 

是否有如何做到这一点?

对答案和帮助表示赞赏。

回答

2

感谢Ekkehard.Horner发现我的错误。

更新:

Const FOR_READING = 1 
Const FOR_WRITING = 2 
strFileName = "C:\scripts\test.txt" 

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 ShouldSkip(i) Then 
     objTS.WriteLine arrLines(i) 
    End If 
Next 

Function ShouldSkip(i) 
    Dim arrSkipLines, x 
    arrSkipLines = Array(1, 22, 32, 42, 169) 
    For Each x In arrSkipLines 
     If x = i Then 
      ShouldSkip = True 
      Exit Function 
     End If 
    Next 

    ShouldSkip = False 
End Function 
+0

谢谢托马斯,我做了一些改变,让我的预期的输出,而不是使用'If UBound(Filter(arrSkipLines,i)= 0 Then'I'If UBound(Filter(arrSkipLines,i)<> 0 Then')。对于数组,我将数组设置为:arrSkipLines = Array 2)'所以第3行将被删除。你的回答给了我如何去做的想法,谢谢!:) – Djamille

+0

UBound()返回数组的最后一个索引(即count - 1);所以它对于一个空数组是-1,对于只有一个元素的数组则为0。 –

+0

@ Ekkehard.Horner该死的权利。我将不得不修改我的答案,因为Filter将返回包含i的所有元素。 –

1

为了表明@Thomas(和其他人)的条件应该是

If UBound(Filter(arrSkipLines, i) = -1 Then ' i not found in array/Filter returns empty array 


>> WScript.Echo UBound(Filter(Array(1,2,3),2)) 
>> 
0 
>> WScript.Echo UBound(Filter(Array(1,2,3),4)) 
>> 
-1