【问题标题】:How to delete (remove) a specific line of a text file based on the line number?如何根据行号删除(删除)文本文件的特定行?
【发布时间】:2019-03-19 22:32:28
【问题描述】:

我有一个简单的脚本,可以删除文本文件的前 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

有没有办法做到这一点?

非常感谢您的回答和帮助。

【问题讨论】:

    标签: vbscript


    【解决方案1】:

    感谢 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
    

    【讨论】:

    • 谢谢你,Thomas,我做了一些更改以获得预期的输出,而不是使用If UBound(Filter(arrSkipLines, i) = 0 Then,我使用了If UBound(Filter(arrSkipLines, i) <> 0 Then。对于数组,我将数组设置为:arrSkipLines = Array(2),因此将删除第 3 行。你的回答给了我如何做的想法,谢谢! :)
    • UBound() 返回数组的最后一个索引(即 count - 1);所以空数组为 -1,只有一个元素的数组为 0。
    • @Ekkehard.Horner 该死的你的权利。我将不得不修改我的答案,因为 Filter 正在返回包含 i 的所有元素。
    • @Djamille 您对 的看法是正确的,但是我错过了有关使用过滤器的一个重要方面,它返回包含搜索短语的所有元素。请使用我更新的代码。
    • @ThomasInzina - 查看我的临时/伪答案。
    【解决方案2】:

    只是为了向@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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      相关资源
      最近更新 更多