【问题标题】:How do I delete only character 23 to 33 of all lines of a text file?如何仅删除文本文件所有行的第 23 到 33 个字符?
【发布时间】:2024-01-24 05:07:02
【问题描述】:

文本行是这样的:

12341234567 2635473234 123456789 sfhwruewtbdsvmhsgfiergn(这是其中的一行)

12341234567 2635473234 xxxxxxxxx sfhwruewtbdsvmhsgfiergn(我只希望将 X 替换为空格)和各自位置的其他文本完好无损。

该文件是一个日志文件,有时长达 500 行。

【问题讨论】:

  • 字符 23 到 33 为 10 个字符,123456789 为 9 个字符

标签: vbscript


【解决方案1】:

编辑:在 WriteLine 上删除 ()

我帮你一个忙

将输入输出文件路径改为全路径

参考:Read and write into a file using VBScript

Dim objFSO
dim objFile
dim thisLine
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile("C:\Users\wangCL\Desktop\data.txt")
If objFile.Size > 0 Then 'make sure the input file is not empty
    Set inputFile = objFSO.OpenTextFile("C:\Users\wangCL\Desktop\data.txt", 1)  'Replace the filename here
    set outputFile = objFSO.CreateTextFile("C:\Users\wangCL\Desktop\output.txt", TRUE) 'replace it with output filename

    do while not inputFile.AtEndOfStream                           
        thisLine = inputFile.ReadLine  ' Read an entire line into a string.
        newLine = mid(thisLine,1,23) & "         " & mid(thisLine,33)
        outputFile.WriteLine newLine
    loop
    inputFile.Close
    outputFile.Close
end if

【讨论】:

  • 我会在你删除 .WriteLine 语句中的虚假 () 后立即投票
  • .WriteLine 语句是一个 Sub 调用(未获得返回值),并且错误 1044“调用 Sub 时不能使用括号”仅被隐藏,因为“编译器”将 () 视为“请按值传递给我”括号。
  • 先生,虽然该脚本运行良好,但运行该文件时出现错误
  • 先生,该脚本运行良好,但它应该删除数字而不是文本,即使它存在于该特定位置..
  • @JoeJames 嗨,请澄清几个案例。 1.你的意思是用空格替换而不是删除? 2. 部分号码呢?例如a1b2c3d4e5 ?谢谢
【解决方案2】:

正如您要求删除(不替换为空格),我建议:

  Const csInF  = "..\data\13930436.txt"
  Const csOutF = "..\data\13930436-c.txt"
  Dim oFS  : Set oFS = CreateObject("Scripting.FileSystemObject")
  Dim sAll : sAll    = oFS.OpenTextFile(csInF).ReadAll()
  WScript.Echo sAll
  Dim reR  : Set reR = New RegExp
  reR.Global = True
  reR.Multiline = True
  reR.Pattern = "^(.{23})(.{10})"
  WScript.Echo reR.Pattern
  oFS.CreateTextFile(csOutF, True).Write reR.Replace(sAll, "$1")
  WScript.Echo oFS.OpenTextFile(csOutF).ReadAll()

输出:

============================================================
12341234567 2635473234 123456789 sfhwruewtbdsvmhsgfiergn
12341234567 2635473234 XxxxxxxxX sfhwruewtbdsvmhsgfiergn
12341234567 2635473234 ......... sfhwruewtbdsvmhsgfiergn

^(.{23})(.{10})
12341234567 2635473234 sfhwruewtbdsvmhsgfiergn
12341234567 2635473234 sfhwruewtbdsvmhsgfiergn
12341234567 2635473234 sfhwruewtbdsvmhsgfiergn

============================================================

要在生产中使用“ReadAll, Replace using RegExp, Write back”策略,您应该学习 VBScript 文档 wrt FileSystemObject 和 RegExp。

更新(规格变更后):

使用

  oFS.CreateTextFile(csOutF, True).Write reR.Replace(sAll, "$1" & Space(10))

得到:

...
12341234567 2635473234 ......... sfhwruewtbdsvmhsgfiergn

^(.{23})(.{10})
12341234567 2635473234           sfhwruewtbdsvmhsgfiergn
...

更新 II(规格更改后:仅限 zap 编号):

更改正则表达式模式

  reR.Pattern = "^(.{23})(.{10})"   ' look for 10 arbitrary characters (.)

  reR.Pattern = "^(.{23})(\d{9} )" ' look for 9 digits (\d) plus 1 space

输出:

12341234567 2635473234 123456789 sfhwruewtbdsvmhsgfiergn
12341234567 2635473234 XxxxxxxxX sfhwruewtbdsvmhsgfiergn
12341234567 2635473234 987654321 sfhwruewtbdsvmhsgfiergn
12341234567 2635473234 abcdefghi sfhwruewtbdsvmhsgfiergn

^(.{23})(\d{9} )
12341234567 2635473234           sfhwruewtbdsvmhsgfiergn
12341234567 2635473234 XxxxxxxxX sfhwruewtbdsvmhsgfiergn
12341234567 2635473234           sfhwruewtbdsvmhsgfiergn
12341234567 2635473234 abcdefghi sfhwruewtbdsvmhsgfiergn

请参阅RegExp Syntax 了解图案中有趣的字母。

【讨论】:

  • 先生,虽然该脚本运行良好,但问题是它甚至删除了下一行同一位置的文本。你能给我一个解决方案,脚本只删除那个特定位置的数字而不是文本