返回列表 发帖

[问题求助] 【已解决】请教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 .....

试试
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"COPY
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 编辑
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"COPY
1

评分人数

TOP

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

TOP

本帖最后由 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
pauseCOPY
1

评分人数

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

TOP

回复 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"COPY
请参考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

返回列表