中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]文本指定符号之间的字符替换
作者:
标题: [求助]文本指定符号之间的字符替换 上一主题 | 下一主题
cnxyc
新手上路





积分 15
发帖 15
注册 2008-10-13
状态 离线
『楼 主』:  [求助]文本指定符号之间的字符替换

文本文件有上千行,每一行内容由英文的逗号分隔为5部分,例如:ab,f1,10000,10000,1000要求检测第二部分字符长度,大于4则提示出错并显示行号,判断第二部分的英文字母个数,如果有多个则只保留第一个,然后把此英文字母替换为数字,如果为a则换为101,为b则换为102,以此类推,如这里的f则换为106。补充,这里的英文不分大小写,可使用外部命令。

[ Last edited by cnxyc on 2010-12-4 at 14:27 ]

2010-12-4 14:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 2 楼』:  

1,文本是否只包括数字,字母以及逗号?
2,提示错误需要输出到文本吗?
3,替换后将5部分数据写回到源文件?
4,z为126还是1026?
5,当字符大于4个时,是否也进行字符替换
6,第2部分的数据是否由“n个字码+n个数字”构成?还是字母和数字混在一起?

[ Last edited by Hanyeguxing on 2010-12-4 at 15:07 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-12-4 14:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
cnxyc
新手上路





积分 15
发帖 15
注册 2008-10-13
状态 离线
『第 3 楼』:  谢谢hanyeguxing的热心提问!

谢谢hanyeguxing的热心提问!
1:文本只包括数字、字母以及逗号。
2:提示出错不需要输出到文件,只需要暂停等待用户响应然后终止程序。
3:替换后将5部分数据写到新文件,源文件保留。
4:这个问题是我疏忽了,对不起。这里如果为z则替换为126
5:当字符大于4时不进行替换,提示错误信息,显示行号,提示用户修改然后重新执行批处理。
6:第二部分数据有几种情况出现,1个字母,3个数字,1个字母加1个数字,4个数字。

2010-12-4 15:37
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 4 楼』:  


@echo off
::设置源文件
set han=han.txt
::设置输出文件
set ye=ye.txt
::初始变量组
setlocal enabledelayedexpansion
for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set/a xing+=1&set xing_=0!xing!&set #%%a=1!xing_:~-2!
::检查
for /f "tokens=1,3 delims=:," %%a in ('findstr /n .* "%han%"') do (
    set xing=%%b
    if not "!xing:~4,1!"=="" echo 错误行:%%a&pause&exit
)
::解析
for /f "usebackq tokens=1-5 delims=," %%a in ("%han%") do call:xing %%b %%a %%c %%d %%e
exit
:xing:替换并输出
setlocal enabledelayedexpansion
set xing=%1
for /l %%a in (0,1,3) do if not "!xing:~%%a,1!"=="" for %%b in (!xing:~%%a^,1!) do if "%%b" leq "9" (set gu=!gu!%%b) else if not defined set set gu=!gu!!#%%b!&set set==
>>"%ye%" echo %2,!gu!,%3,%4,%5
Endlocal
[ Last edited by Hanyeguxing on 2010-12-4 at 17:52 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-12-4 17:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
cnxyc
新手上路





积分 15
发帖 15
注册 2008-10-13
状态 离线
『第 5 楼』:  谢谢解答!

谢谢孤星的解答,如果我需要把英文字母转换为其他数字呢?就是转换过程不能用运算的方法,而是直接替换,比如现在想把
a转为107
b转为120
c转为166
因为下午在上班,没能及时回复,对不起啊。

2010-12-4 18:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 6 楼』:  

修改:
for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set/a xing+=1&set xing_=0!xing!&set #%%a=1!xing_:~-2!
部分,例如:
@echo off&setlocal enabledelayedexpansion
for %%a in (a51 b42 c74 d85 e99 f57 g19 h94 i59 j83 k64 l48 m62 n82 o15 p39 q20 r5224 s42 t61 u88 v47 w25 x50 y12 z94) do set a=%%a&set #!a:~0,1!=1!a:~-2!
[ Last edited by Hanyeguxing on 2010-12-4 at 18:56 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-12-4 18:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
cnxyc
新手上路





积分 15
发帖 15
注册 2008-10-13
状态 离线
『第 7 楼』:  我是初学,没明白意思。

不好意思啊,初学。我把我现在要转换的贴出来,你帮忙改改代码。还有就是第一部分数据的长度不定,不过一般都在10位以下。以后要换其他转换数字我自己慢慢摸索吧。谢谢!
a转为166
b转为120
c转为654
d转为602
e转为922
f转为202
g转为904
h转为148
i转为610
j转为589
k转为921
l转为563
m转为248
n转为562
o转为357
p转为918
q转为750
r转为548
s转为181
t转为233
u转为919
v转为600
w转为677
x转为667
y转为220
z转为107

2010-12-4 19:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
cnxyc
新手上路





积分 15
发帖 15
注册 2008-10-13
状态 离线
『第 8 楼』:  贴个示例

BG001,Z,100000.047,200000.581,1000.583
BG002,Z,104400.330,265000.458,1200.653
1000,B,107500.580,208500.068,1040.558
1001,B1,189500.588,255000.589,1100.583
1002,F,105840.584,268000.451,1060.483
1100,F1,102570.657,272000.471,1050.123
5,F2,108560.586,258980.571,1050.333
6,5482,100580.586,204570.541,1005.222
7,FF2021,55565.585,648555.444,1254.568

2010-12-4 19:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 9 楼』:  

到底要转换哪部分里的字母?



批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-12-5 02:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
cnxyc
新手上路





积分 15
发帖 15
注册 2008-10-13
状态 离线
『第 10 楼』:  

转第二部分的字母

2010-12-5 12:10
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
cnxyc
新手上路





积分 15
发帖 15
注册 2008-10-13
状态 离线
『第 11 楼』:  示例中最后一行第二部分数据是故意那样输的

示例中最后一行第二部分数据是故意那样输的,目的是测试批处理排错功能。

2010-12-5 12:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 12 楼』:  

只对第二部分检查、替换:
@echo off&setlocal enabledelayedexpansion
set han=han.txt
set ye=ye.txt
for /f "delims=" %%a in ('more +17^<"%~fs0"') do set a=%%a&set #!a:~0,1!=!a:~-3!
for /f "tokens=1,3 delims=:," %%a in ('findstr /n .* "%han%"') do (
    set xing=%%b
    if not "!xing:~4,1!"=="" echo 错误行:%%a&pause&exit
)
for /f "usebackq tokens=1-5 delims=," %%a in ("%han%") do call:xing %%b %%a %%c %%d %%e
exit
:xing:替换并输出
setlocal enabledelayedexpansion
set xing=%1
for /l %%a in (0,1,3) do if not "!xing:~%%a,1!"=="" for %%b in (!xing:~%%a^,1!) do if "%%b" leq "9" (set gu=!gu!%%b) else if not defined set set gu=!gu!!#%%b!&set set==
>>"%ye%" echo %2,!gu!,%3,%4,%5
Endlocal
goto:eof
a166
b120
c654
d602
e922
f202
g904
h148
i610
j589
k921
l563
m248
n562
o357
p918
q750
r548
s181
t233
u919
v600
w677
x667
y220
z107


   此帖被 +1 点积分    点击查看详情   
评分人:【 cnxyc 分数: +1  时间:2010-12-7 01:17




批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-12-5 12:25
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
cnxyc
新手上路





积分 15
发帖 15
注册 2008-10-13
状态 离线
『第 13 楼』:  大哥,谢谢啦!

帮我大忙了,虽然感谢的话在这里显得很苍白,但我还是谢谢孤星大哥的热心!

2010-12-7 01:21
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: