【问题标题】:VBscript: Loop through all text files in a folder, delete the first and last line of each file and merge into one fileVBscript:循环遍历文件夹中的所有文本文件,删除每个文件的第一行和最后一行并合并为一个文件
【发布时间】:2015-02-14 07:20:58
【问题描述】:

我是一个新手,正在寻找一种在 vb 脚本中执行以下操作的方法: 我在特定文件夹(C:\data)中有几个文本文件,我想遍历所有文本文件,删除每个文本文件的第一行和最后一行,然后将所有文件合并/合并到一个文本文件中。 非常感谢您的帮助。提前致谢。

这是我在阅读/搜索网络数小时后所写的内容(但它以无限循环结束):

Const ForReading = 1

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set folder = objFSO.GetFolder("C:\data\")
Set outFile = objFSO.CreateTextFile("C:\data\out\testout.txt")

for each file in folder.Files

if lcase(objFSO.getExtensionName(file.path))="txt" then

Set testfile = objFSO.OpenTextFile(file.path, ForReading)


Do Until testfile.AtEndOfStream
  If testfile.Line <= 1 Then
    testfile.SkipLine
  Else
    if Not IsEmpty(line) Then outFile.WriteLine(line)
    line = testfile.ReadLine
  End If
Loop

testfile.Close

End If

next

outFile.Close

【问题讨论】:

    标签: vbscript


    【解决方案1】:

    始终使用option explicit 语句。这样做也有助于揭示语法和逻辑中的错误。

    以下是一些代码改进提示:

    • 涉及线路计数器(请参阅linecount)。
    • IsEmpty 函数返回一个布尔值,指示变量是否已初始化。你是说空字符串吗?
    • 注意并考虑line = "" 语句。

    但是,下一个代码 sn-p 可以工作。但可以按预期工作吗?

    Set testfile = objFSO.OpenTextFile(file.path, ForReading)
    line = ""
    linecount = 1           ' or 0 ?
    Do Until testfile.AtEndOfStream
      If linecount <= 1 Then
        testfile.SkipLine
        line = ""
      Else
        if Not Trim(line) = "" Then outFile.WriteLine(line)
        line = testfile.ReadLine
      End If
      linecount = linecount +1
    Loop
    testfile.Close
    

    编辑根据 Ekkehard.Horner 的评论(谢谢):

    • 他是正确的第五轮:),
    • 他是正确的,跳过了第一行,
    • 最后一行不会被写入,因为.ReadLine成功输出写入。

    所以sn-p的代码可以如下:

    Set testfile = objFSO.OpenTextFile(file.path, ForReading)
    line = ""
    if not testfile.AtEndOfStream then testfile.SkipLine
    Do Until testfile.AtEndOfStream
        if Not Trim(line) = "" Then outFile.WriteLine(line)
        line = testfile.ReadLine
    Loop
    testfile.Close
    

    Edit2:保留空行

    Set testfile = objFSO.OpenTextFile(file.path, ForReading)
    
    set line=Nothing
    
    if not testfile.AtEndOfStream then testfile.SkipLine
    Do Until testfile.AtEndOfStream
        if Not IsObject(line) Then outFile.WriteLine(line)
        line = testfile.ReadLine
    Loop
    testfile.Close
    

    根据this Ekkehard.Horner's comment编辑

    【讨论】:

    • 一个文本流一个行计数器(.Line),所以行数是第5个轮子;第一行应该被跳过之前循环;不写最后一行的相同策略。
    • if Not Trim(line) = "" Then outFile.WriteLine(line) 仍然是一个 If (and a Trim()) in 应该避免的循环,特别是因为它会删除第一个和最后一个 (不在规格中)。顺便说一句:@trospe 对 IsEmpty() 的使用是完全正确的。
    • @Ekkehard.Horner Ad IsEmpty():正确照此,但仅适用于for each 循环中的第一个文件。开始第二个文件结果到false,因此前一个文件的最后一行将被写入输出。广告 empty lines:很久以前用 unlike string“解决”了(参见edit2),但现在我看到了更好的解决方案:set line=Nothing 而不是 line=unlikestring 并测试 @ 987654336@ 而不是 if Not line = unlikestring then
    【解决方案2】:

    我无法在评论中添加的内容:

    type 28507073.vbs
    Option Explicit
    
    Dim tsIn : Set tsIn = CreateObject("Scripting.FileSystemObject").OpenTextFile(".\28507073.txt")
    If tsIn.AtEndOfStream Then
       WScript.Echo "Empty file"
    Else
       tsIn.SkipLine
       If Not tsIn.AtEndOfStream Then
          Dim s : s = tsIn.ReadLine()
          Do Until tsIn.AtEndOfStream
             WScript.Echo s
             s = tsIn.ReadLine()
          Loop
       End If
    End If
    tsIn.Close
    
    type 28507073.txt
    1
    2
    3
    4
    
    cscript 28507073.vbs
    2
    3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多