批处理 如何取文本中指定字符串间的数字,并做运算后生成新的文本?
原a.txt内容:a*ab(258)cd*da*c*ab(76)cd*a*dc*aa*d*ab(8)cd*需要生成的b.txt内容:a*ab(16,0,0,1)cd*da...
原a.txt内容:
a*ab(258)cd*d
a*c*ab(76)cd*a*d
c*aa*d*ab(8)cd*
需要生成的b.txt内容:
a*ab(16,0,0,1)cd*d
a*c*ab(4,1,1,0)cd*a*d
c*aa*d*ab(0,1,0,0)cd*
运算法则是,获每行取字符串 ab( 和 )cd 间的数字,并依次除以16 8 4 2把得到的商作为值,余下的数继续除
以原文件中第二行为例:a*c*ab(76)cd*a*d
先获取字符串 ab( 和 )cd 间的数字 76,再运算如下
76 除以 16 得4 余12
12 除以 8 得1 余4
4 除以 4 得1余0
0 除以 2 得0
最后要转化成字符串 4,1,1,0 替换原来的 数字 76
得到 a*c*ab(4,1,1,0)cd*a*d
每行都要这样处理,有哪位大侠能帮帮忙,最好给予每行代码的说明,谢谢! 展开
a*ab(258)cd*d
a*c*ab(76)cd*a*d
c*aa*d*ab(8)cd*
需要生成的b.txt内容:
a*ab(16,0,0,1)cd*d
a*c*ab(4,1,1,0)cd*a*d
c*aa*d*ab(0,1,0,0)cd*
运算法则是,获每行取字符串 ab( 和 )cd 间的数字,并依次除以16 8 4 2把得到的商作为值,余下的数继续除
以原文件中第二行为例:a*c*ab(76)cd*a*d
先获取字符串 ab( 和 )cd 间的数字 76,再运算如下
76 除以 16 得4 余12
12 除以 8 得1 余4
4 除以 4 得1余0
0 除以 2 得0
最后要转化成字符串 4,1,1,0 替换原来的 数字 76
得到 a*c*ab(4,1,1,0)cd*a*d
每行都要这样处理,有哪位大侠能帮帮忙,最好给予每行代码的说明,谢谢! 展开
展开全部
current=Replace(WScript.ScriptFullName,WScript.ScriptName,"")
Dim fname
fname="a.txt" '改成相应的原始文件
Dim fso
Set fso = CreateObject("scripting.filesystemobject")
Set ff=fso.OpenTextFile(current&fname,1)
Dim strs:strs=""
Dim stmp:stmp=""
Dim quo(4)
Do While Not ff.AtEndOfStream
stmp=""
stmp=ff.ReadLine
tmp=RegExpTest("\(\d+\)",stmp)
numb=CInt(Replace(Replace(tmp,"(",""),")",""))
Erase quo
quo(0)=numb\16 &","
quo(1)=(numb Mod 16)\8 &","
quo(2)=(numb Mod 16 Mod 8)\4 &","
quo(3)=(numb Mod 16 Mod 8 Mod 4)\2
Dim sline
sline=Replace(stmp,tmp,("("&quo(0)&quo(1)&quo(2)&quo(3)&")"))
strs=strs&sline & vbcrlf
Loop
ff.Close
'WScript.Echo strs
Set ft=fso.CreateTextFile(current&"b.txt")
ft.Write strs
ft.Close
Function RegExpTest(patrn, strng)
Dim regEx, Match, Matches ' 建立变量。
Set regEx = New RegExp ' 建立正则表达式。
regEx.Pattern = patrn ' 设置模式。
regEx.IgnoreCase = True ' 设置是否区分字符大小写。
regEx.Global = True ' 设置全局可用性。
Set Matches = regEx.Execute(strng) ' 执行搜索。
For Each Match in Matches ' 遍历匹配集合。
RetStr = Match.Value
Next
RegExpTest = RetStr
End Function
'保存为xx.vbs 放在同目录下运行就行了,好运!
‘附:楼上的代码短小精悍,佩服。 貌似偶的代码是vbs,不用正则的话,代码会短小一些,也许是杀鸡用牛刀了,呵呵
Dim fname
fname="a.txt" '改成相应的原始文件
Dim fso
Set fso = CreateObject("scripting.filesystemobject")
Set ff=fso.OpenTextFile(current&fname,1)
Dim strs:strs=""
Dim stmp:stmp=""
Dim quo(4)
Do While Not ff.AtEndOfStream
stmp=""
stmp=ff.ReadLine
tmp=RegExpTest("\(\d+\)",stmp)
numb=CInt(Replace(Replace(tmp,"(",""),")",""))
Erase quo
quo(0)=numb\16 &","
quo(1)=(numb Mod 16)\8 &","
quo(2)=(numb Mod 16 Mod 8)\4 &","
quo(3)=(numb Mod 16 Mod 8 Mod 4)\2
Dim sline
sline=Replace(stmp,tmp,("("&quo(0)&quo(1)&quo(2)&quo(3)&")"))
strs=strs&sline & vbcrlf
Loop
ff.Close
'WScript.Echo strs
Set ft=fso.CreateTextFile(current&"b.txt")
ft.Write strs
ft.Close
Function RegExpTest(patrn, strng)
Dim regEx, Match, Matches ' 建立变量。
Set regEx = New RegExp ' 建立正则表达式。
regEx.Pattern = patrn ' 设置模式。
regEx.IgnoreCase = True ' 设置是否区分字符大小写。
regEx.Global = True ' 设置全局可用性。
Set Matches = regEx.Execute(strng) ' 执行搜索。
For Each Match in Matches ' 遍历匹配集合。
RetStr = Match.Value
Next
RegExpTest = RetStr
End Function
'保存为xx.vbs 放在同目录下运行就行了,好运!
‘附:楼上的代码短小精悍,佩服。 貌似偶的代码是vbs,不用正则的话,代码会短小一些,也许是杀鸡用牛刀了,呵呵
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-06-10
展开全部
说明:就是按你的要求来的,代码说明,就算了,如果你懂自然会懂的。
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1-3 delims=()" %%i in (a.txt) do (
set/a s1=%%j/16,s2=%%j%%16/8,s3=%%j%%16%%8/4,s4=%%j%%16%%8%%4/2
echo %%i^(!s1!,!s2!,!s3!,!s4!^)%%k>>b.txt)
第二种:先判断b.txt是否存在,自己选择运行:
@echo off
if exist b.txt (echo b.txt已存在&set/p a=是否继续^(Y/N^):)
if /i "%a%"=="n" (exit)
setlocal enabledelayedexpansion
for /f "tokens=1-3 delims=()" %%i in (a.txt) do (
set/a s1=%%j/16,s2=%%j%%16/8,s3=%%j%%16%%8/4,s4=%%j%%16%%8%%4/2
echo %%i^(!s1!,!s2!,!s3!,!s4!^)%%k>>b.txt)
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1-3 delims=()" %%i in (a.txt) do (
set/a s1=%%j/16,s2=%%j%%16/8,s3=%%j%%16%%8/4,s4=%%j%%16%%8%%4/2
echo %%i^(!s1!,!s2!,!s3!,!s4!^)%%k>>b.txt)
第二种:先判断b.txt是否存在,自己选择运行:
@echo off
if exist b.txt (echo b.txt已存在&set/p a=是否继续^(Y/N^):)
if /i "%a%"=="n" (exit)
setlocal enabledelayedexpansion
for /f "tokens=1-3 delims=()" %%i in (a.txt) do (
set/a s1=%%j/16,s2=%%j%%16/8,s3=%%j%%16%%8/4,s4=%%j%%16%%8%%4/2
echo %%i^(!s1!,!s2!,!s3!,!s4!^)%%k>>b.txt)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
推荐用软件Replace Pioneer做一个简单的替换就可以了,详细步骤:
1. ctrl-o打开a.txt
2. ctrl-h打开替换窗口
在search for pattern输入"ab\((\d+)\)cd"(不带双引号)
在replace with pattern输入
"ab\(sprintf("%d,%d,%d,%d",$1/16,$1%16/8,$1%16%8/4,$1%16%8%4/2)\)cd"(不带双引号)
3. 点击replace即可,经测试成功。
4. ctrl-s保存为b.txt
如果一次处理多个文件,第3步点击Batch...按钮,然后把多个文件拖拽到Batch Runner窗口中,点击Batch Replace即可。
1. ctrl-o打开a.txt
2. ctrl-h打开替换窗口
在search for pattern输入"ab\((\d+)\)cd"(不带双引号)
在replace with pattern输入
"ab\(sprintf("%d,%d,%d,%d",$1/16,$1%16/8,$1%16%8/4,$1%16%8%4/2)\)cd"(不带双引号)
3. 点击replace即可,经测试成功。
4. ctrl-s保存为b.txt
如果一次处理多个文件,第3步点击Batch...按钮,然后把多个文件拖拽到Batch Runner窗口中,点击Batch Replace即可。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一楼好象理解错了,再写一个,f1=原文件 f2=新文件,需要解释另 Hi 交流
echo off&setlocal enabledelayedexpansion
set f1=a.txt
set f2=b.txt
(for /f "usebackq tokens=1,2* delims=()" %%a in ("%f1%")do (
set h=%%b
for %%i in (16 8 4 2)do set/a "s%%i=h/%%i,h%%=%%i"
echo.%%a^(!s16!,!s8!,!s4!,!s2!^)%%c
))>"%f2%"
start "" "%f2%"
echo off&setlocal enabledelayedexpansion
set f1=a.txt
set f2=b.txt
(for /f "usebackq tokens=1,2* delims=()" %%a in ("%f1%")do (
set h=%%b
for %%i in (16 8 4 2)do set/a "s%%i=h/%%i,h%%=%%i"
echo.%%a^(!s16!,!s8!,!s4!,!s2!^)%%c
))>"%f2%"
start "" "%f2%"
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用位运算貌似会更快点:
@echo off&Setlocal EnableDelayedExpansion
(for /f "usebackq tokens=1-3 delims=()" %%i in ("a.txt") do (
set "y=%%j"
(for /l %%a in (4 -1 1) do (
set/a n+=1
set/a $!n!=!y!">>"%%a
set/a y%%="("1"<<"%%a")"
))&set "n="
for /f "tokens=2 delims==" %%b in ('set $') do set "r=!r!%%b,"
echo;%%i^(!r!^)%%k& set "r="
))>b.txt
@echo off&Setlocal EnableDelayedExpansion
(for /f "usebackq tokens=1-3 delims=()" %%i in ("a.txt") do (
set "y=%%j"
(for /l %%a in (4 -1 1) do (
set/a n+=1
set/a $!n!=!y!">>"%%a
set/a y%%="("1"<<"%%a")"
))&set "n="
for /f "tokens=2 delims==" %%b in ('set $') do set "r=!r!%%b,"
echo;%%i^(!r!^)%%k& set "r="
))>b.txt
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询