2016-07-21 119 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