[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] 【已解决】请教VBS如何替换某文本中部分单词中某个字符?

本帖最后由 loveforjg 于 2020-12-22 15:14 编辑

输入文本(input.txt 多行):
(AA-A B-B C-C D-D .....)
需要输出:(out.txt  去掉括号,首个单词后用冒号隔开,并将之外的单词(个数未知)的横杠替换为点)
AA-A;B.B C.C  D.D .....

试试
  1. Rem On Error Resume Next
  2. Dim srcFile, dstFile, fso, objFile
  3. srcFile = "in.txt"         '输入文件
  4. dstFile = "out.txt"        '输出文件
  5. Set fso = CreateObject("Scripting.FileSystemObject")
  6. Set objFile = fso.OpenTextFile(srcFile, 1)
  7. Dim reg1, strLine, n, out(), match, reg2, s
  8. Set reg1 = New RegExp
  9. Set reg2 = New RegExp
  10. reg1.Pattern = "^\s*\(\s*(?=([^)\s]+))\1\s+(?=([^)]+))\2\)\s*$"
  11. reg2.Pattern = "(?:\S+\s+){9}(?=(\S+))\1(?!\s*$)"
  12. reg2.Global = True
  13. n = 0
  14. while Not objFile.AtEndOfStream
  15.     ReDim Preserve out(n)
  16.     strLine = objFile.ReadLine
  17.     If reg1.Test(strLine) Then
  18.         Set match = reg1.Execute(strLine)(0)
  19.         s = Replace(match.SubMatches(1), "-", ".")
  20.         s = reg2.Replace(s, "$&," + vbCrLf + "    ")
  21.         out(n) = match.SubMatches(0) + ";" + s
  22.     Else
  23.         out(n) = strLine
  24.     End If
  25.     n = n + 1
  26. wend
  27. objFile.Close
  28. fso.OpenTextFile(dstFile, 2, True).Write Join(out, vbCrLf)
  29. MsgBox "Done"
复制代码
1

评分人数

    • loveforjg: 可以了 太牛了,您这个正则式太巧妙了,求解 ...技术 + 1

TOP

回复 10# WHY
输出每行不一定固定字符数量,但不要超过256,字符串按空格识别,没有中文。
因为每个字符串不会太长,所以我认为可以不识别字符个数,而是:
固定字符串个数,每行输出10个,每行以逗号结尾
即输出为
AA-A;B1.1 B2.1......B10.1 ,
       C1.1 C2.1 .....   C10.1 ,
       ......

TOP

回复 9# loveforjg


    请给一个真实的数据样本文件便于测试,如果文件过大,可以放到网盘。
另外,请确认是以256“字节”还是256“字符”为单位分割行?文本中是否包含宽字符(中文字符)?

TOP

回复 5# WHY

大神您好,遇到新的问题,就是有的行输出文本太长了,超过了每行的识别数量,后面的都不识别了。
能否帮忙改下,就是每行的字节以不超过256,用逗号隔开,并换行。
输出格式如下: (每行250左右字节长度)   
AA-A;B.B C.C  D.D EE.E ... ,
       F.FF G.GG.................H.1 ,
      .........

TOP

回复 7# WHY
完美,谢谢!
正则式强大,一直摸不透

TOP

回复 6# loveforjg


    已改。

TOP

回复 5# WHY
清晰明了,牛!
有一个问题,括号后面是有空格的,这个代码会把(当做第一个数,输出结果变成了
;AA.A B.B C.C  D.D .....
是不是做成3个数才行?

TOP

本帖最后由 WHY 于 2020-12-12 10:06 编辑
  1. Rem On Error Resume Next
  2. Dim srcFile, dstFile, fso, objFile
  3. srcFile = "a.txt"    '输入文件
  4. dstFile = "b.txt"    '输出文件
  5. Set fso = CreateObject("Scripting.FileSystemObject")
  6. Set objFile = fso.OpenTextFile(srcFile, 1)
  7. Dim reg, strLine, n, out, match
  8. Set reg = New RegExp
  9. reg.Pattern = "^\s*[((]\s*(?=([^))\s]+))\1\s+(?=([^))]+))\2[))]\s*$"
  10. n = 0
  11. ReDim out(n)
  12. while Not objFile.AtEndOfStream
  13.     ReDim Preserve out(n)
  14.     strLine = objFile.ReadLine
  15.     If reg.Test(strLine) Then
  16.         Set match = reg.Execute(strLine)(0)
  17.         out(n) = match.SubMatches(0) + ";" + Replace(match.SubMatches(1), "-", ".")
  18.     Else
  19.         out(n) = strLine
  20.     End If
  21.     n = n + 1
  22. wend
  23. objFile.Close
  24. fso.OpenTextFile(dstFile, 2, True).Write Join(out, vbCrLf)
  25. MsgBox "Done"
复制代码
1

评分人数

TOP

回复 3# qixiaobin0715
谢谢解答,不过我需要VBS的代码~

TOP

本帖最后由 qixiaobin0715 于 2020-12-7 15:29 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "tokens=1,* delims= " %%a in (input.txt) do (
  4. set "str=%%b"
  5. set "var=%%a"
  6. set "var=!var:~1!"
  7. set "str=!str:~0,-1!"
  8. set "str=!str:-=.!"
  9. echo !var!;!str!
  10. ))>out.txt
  11. pause
复制代码
1

评分人数

    • loveforjg: 谢谢解答,不过我需要VBS的代码~技术 + 1

TOP

回复 1# loveforjg
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "tokens=1*" %%a in ('type "input.txt"') do (
  4.     set "strA=%%a"
  5.     set "strA=!strA:(=!"
  6.     set "strB=%%b"
  7.     set "strB=!strB:-=.!"
  8.     set "strB=!strB:)=!"
  9.     echo !strA!: !strB!
  10. ))>"out.txt"
复制代码
请参考Q-04和Q-05把bat文件和txt文件都保存为ANSI编码:
https://mp.weixin.qq.com/s/6lbb97qUOs1sTyKJfN0ZEQ
1

评分人数

    • loveforjg: 谢谢解答,不过我需要VBS的代码~技术 + 1
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表