标题: [问题求助] 【已解决】请教VBS如何替换某文本中部分单词中某个字符? [打印本页]
作者: loveforjg 时间: 2020-12-7 14:53 标题: 【已解决】请教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 .....
作者: Batcher 时间: 2020-12-7 15:13
回复 1# loveforjg - @echo off
- setlocal enabledelayedexpansion
- (for /f "tokens=1*" %%a in ('type "input.txt"') do (
- set "strA=%%a"
- set "strA=!strA:(=!"
- set "strB=%%b"
- set "strB=!strB:-=.!"
- set "strB=!strB:)=!"
- echo !strA!: !strB!
- ))>"out.txt"
复制代码
请参考Q-04和Q-05把bat文件和txt文件都保存为ANSI编码:
https://mp.weixin.qq.com/s/6lbb97qUOs1sTyKJfN0ZEQ
作者: qixiaobin0715 时间: 2020-12-7 15:22
本帖最后由 qixiaobin0715 于 2020-12-7 15:29 编辑
- @echo off
- setlocal enabledelayedexpansion
- (for /f "tokens=1,* delims= " %%a in (input.txt) do (
- set "str=%%b"
- set "var=%%a"
- set "var=!var:~1!"
- set "str=!str:~0,-1!"
- set "str=!str:-=.!"
- echo !var!;!str!
- ))>out.txt
- pause
复制代码
作者: loveforjg 时间: 2020-12-8 13:58
回复 3# qixiaobin0715
谢谢解答,不过我需要VBS的代码~
作者: WHY 时间: 2020-12-8 16:50
本帖最后由 WHY 于 2020-12-12 10:06 编辑
- Rem On Error Resume Next
- Dim srcFile, dstFile, fso, objFile
- srcFile = "a.txt" '输入文件
- dstFile = "b.txt" '输出文件
- Set fso = CreateObject("Scripting.FileSystemObject")
- Set objFile = fso.OpenTextFile(srcFile, 1)
-
- Dim reg, strLine, n, out, match
- Set reg = New RegExp
- reg.Pattern = "^\s*[((]\s*(?=([^))\s]+))\1\s+(?=([^))]+))\2[))]\s*$"
- n = 0
- ReDim out(n)
-
- while Not objFile.AtEndOfStream
- ReDim Preserve out(n)
- strLine = objFile.ReadLine
- If reg.Test(strLine) Then
- Set match = reg.Execute(strLine)(0)
- out(n) = match.SubMatches(0) + ";" + Replace(match.SubMatches(1), "-", ".")
- Else
- out(n) = strLine
- End If
- n = n + 1
- wend
-
- objFile.Close
- fso.OpenTextFile(dstFile, 2, True).Write Join(out, vbCrLf)
-
- MsgBox "Done"
复制代码
作者: loveforjg 时间: 2020-12-11 11:05
回复 5# WHY
清晰明了,牛!
有一个问题,括号后面是有空格的,这个代码会把(当做第一个数,输出结果变成了
;AA.A B.B C.C D.D .....
是不是做成3个数才行?
作者: WHY 时间: 2020-12-11 15:34
回复 6# loveforjg
已改。
作者: loveforjg 时间: 2020-12-11 15:51
回复 7# WHY
完美,谢谢!
正则式强大,一直摸不透
作者: loveforjg 时间: 2020-12-18 09:38
回复 5# WHY
大神您好,遇到新的问题,就是有的行输出文本太长了,超过了每行的识别数量,后面的都不识别了。
能否帮忙改下,就是每行的字节以不超过256,用逗号隔开,并换行。
输出格式如下: (每行250左右字节长度)
AA-A;B.B C.C D.D EE.E ... ,
F.FF G.GG.................H.1 ,
.........
作者: WHY 时间: 2020-12-18 10:24
回复 9# loveforjg
请给一个真实的数据样本文件便于测试,如果文件过大,可以放到网盘。
另外,请确认是以256“字节”还是256“字符”为单位分割行?文本中是否包含宽字符(中文字符)?
作者: loveforjg 时间: 2020-12-18 16:00
回复 10# WHY
输出每行不一定固定字符数量,但不要超过256,字符串按空格识别,没有中文。
因为每个字符串不会太长,所以我认为可以不识别字符个数,而是:
固定字符串个数,每行输出10个,每行以逗号结尾
即输出为
AA-A;B1.1 B2.1......B10.1 ,
C1.1 C2.1 ..... C10.1 ,
......
作者: WHY 时间: 2020-12-18 17:21
试试- Rem On Error Resume Next
- Dim srcFile, dstFile, fso, objFile
- srcFile = "in.txt" '输入文件
- dstFile = "out.txt" '输出文件
- Set fso = CreateObject("Scripting.FileSystemObject")
- Set objFile = fso.OpenTextFile(srcFile, 1)
-
- Dim reg1, strLine, n, out(), match, reg2, s
- Set reg1 = New RegExp
- Set reg2 = New RegExp
- reg1.Pattern = "^\s*\(\s*(?=([^)\s]+))\1\s+(?=([^)]+))\2\)\s*$"
- reg2.Pattern = "(?:\S+\s+){9}(?=(\S+))\1(?!\s*$)"
- reg2.Global = True
- n = 0
-
- while Not objFile.AtEndOfStream
- ReDim Preserve out(n)
- strLine = objFile.ReadLine
- If reg1.Test(strLine) Then
- Set match = reg1.Execute(strLine)(0)
- s = Replace(match.SubMatches(1), "-", ".")
- s = reg2.Replace(s, "$&," + vbCrLf + " ")
- out(n) = match.SubMatches(0) + ";" + s
- Else
- out(n) = strLine
- End If
- n = n + 1
- wend
-
- objFile.Close
- fso.OpenTextFile(dstFile, 2, True).Write Join(out, vbCrLf)
-
- MsgBox "Done"
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |