中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 条件文本文件替换[已解答]
« [1] [2] [3] [4] »
作者:
标题: 条件文本文件替换[已解答] 上一主题 | 下一主题
yoyodos
初级用户




积分 128
发帖 59
注册 2007-9-15
状态 离线
『第 16 楼』:  

很容易了,把echo 变量 改为echo 到文件就行了

2007-9-24 13:00
查看资料  发送邮件  发短消息 网志  OICQ (52721292)  编辑帖子  回复  引用回复
123cainiao
初级用户





积分 97
发帖 41
注册 2007-8-30
状态 离线
『第 17 楼』:  



  Quote:
Originally posted by yoyodos at 2007-9-24 01:00 PM:
很容易了,把echo 变量 改为echo 到文件就行了

 呵呵,谢谢你.我明白了.

2007-9-24 13:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yoyodos
初级用户




积分 128
发帖 59
注册 2007-9-15
状态 离线
『第 18 楼』:  

一起学习。。哈哈

2007-9-24 13:08
查看资料  发送邮件  发短消息 网志  OICQ (52721292)  编辑帖子  回复  引用回复
yoyodos
初级用户




积分 128
发帖 59
注册 2007-9-15
状态 离线
『第 19 楼』:  

我也贴一个,哈哈
@echo off
setlocal enabledelayedexpansion
cd.>tmp.txt
set /a x=0

for /f "tokens=1 delims=姓名," %%r in (ab.txt) do echo %%r>>tmp.txt
for /f "delims=" %%a in (ab.txt) do (
    set /a x+=1
    set str=%%a
    for /f "tokens=1* delims=:" %%h in ('findstr /n "." tmp.txt') do (
        set n1=%%h
            if !n1!==!x! (
                set replaced=%%i
        )
    )
    for /f "tokens=1* delims=:" %%m in ('findstr /n "." cd.txt') do (
        set n2=%%m
            if !n2!==!x! (
                set new="%%n"
            )
    )
    call :replace
)
del /q tmp.txt
pause

:replace
    set str=!str:%replaced%=%new%!
    echo !str!
[ Last edited by yoyodos on 2007-9-24 at 03:02 PM ]

   此帖被 +2 点积分    点击查看详情   
评分人:【 123cainiao 分数: +2  时间:2007-9-24 15:51


2007-9-24 15:01
查看资料  发送邮件  发短消息 网志  OICQ (52721292)  编辑帖子  回复  引用回复
123cainiao
初级用户





积分 97
发帖 41
注册 2007-8-30
状态 离线
『第 20 楼』:  



  Quote:
Originally posted by yoyodos at 2007-9-24 03:01 PM:
我也贴一个,哈哈
[code]
@echo off
setlocal enabledelayedexpansion
cd.>tmp.txt
set /a x=0

for /f "tokens=1 delims=姓名," %%r in (ab.txt) do echo %%r>>tmp.txt
fo ...

总体来说主要有2个关键点值得学习
1、是 "tokens=1 delims=“的用法,这一点很多时候非常容易弄错
2、是变量替换提取

如果ab.txt的内容由原来的:
姓名"张三",ID'102' ,tel'0102211',0,25,11
姓名"李似答",ID'102' ,tel'0202211',0,25,11
姓名"王二",ID'102' ,tel'01023311',0,25,11
........


变成如下:
abcd rster_www_er 姓 名 "张三",ID'102' ,tel'0102211',0,25,11
abcd rster_www_er 姓 名 "李似答",ID'102' ,tel'0202211',0,25,11
abcd rster_www_er 姓 名 "王二",ID'102' ,tel'01023311',0,25,11
....


那么以上的参考答案代码都需要做适当的修改。
从这里可以知道,如果是编辑一个通用性强的代码,最好能够采用模糊查找定位的方法,比如本例,即使ab.txt文件每行的长度和里面其它内容变化,只要含有
[姓 名 "王二"]这样的字段,就可以查到,并替换.
请问是否可以实现?

2007-9-24 15:51
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yoyodos
初级用户




积分 128
发帖 59
注册 2007-9-15
状态 离线
『第 21 楼』:  

不太明白你的意思,
思路就是将每一行字符串的  “姓名” 替换成 "abcd rster_www_er 姓 名"
是不是就可以呢?
哈哈

2007-9-24 16:10
查看资料  发送邮件  发短消息 网志  OICQ (52721292)  编辑帖子  回复  引用回复
123cainiao
初级用户





积分 97
发帖 41
注册 2007-8-30
状态 离线
『第 22 楼』:  



  Quote:
Originally posted by yoyodos at 2007-9-24 04:10 PM:
不太明白你的意思,
思路就是将每一行字符串的  “姓名” 替换成 "abcd rster_www_er 姓 名"
是不是就可以呢?
哈哈

不是的,我的意思是作为通用性强的搜索语句,采用模糊定位查找,比采用按照分割符号来查找的方式更加实用。
比如最开始的ab.txt文件里的内容:
姓名"张三",ID'102' ,tel'0102211',0,25,11
姓名"李似答",ID'102' ,tel'0202211',0,25,11
姓名"王二",ID'102' ,tel'01023311',0,25,11
这是非常工整的
要是不工整的,变为:
abcd rster_www_er 姓 名 "张三",ID'102' ,tel'0102211',0,25,11
abcd ,er 姓 名 "李似答",ID'102' ,tel'0202211',0,25,11
abcd rster,www,r 姓 名 "王二",ID'102' ,tel'01023311',0,25,11
这样的格式,严格以分割符查找的设计思路,几乎用不成,而采用模糊查找才能实现。
总的来说就是无论你每行文字变成什么样,[姓 名 "张三"]在每行任何不同位置变换,都能实现替换功能。

[ Last edited by 123cainiao on 2007-9-24 at 04:43 PM ]

2007-9-24 16:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yoyodos
初级用户




积分 128
发帖 59
注册 2007-9-15
状态 离线
『第 23 楼』:  

晕,以姓名作分隔符不就行了吗
在delims=后面写姓名,姓 名,姓  名。。。。就能得到后面的名字了啊

2007-9-24 17:18
查看资料  发送邮件  发短消息 网志  OICQ (52721292)  编辑帖子  回复  引用回复
123cainiao
初级用户





积分 97
发帖 41
注册 2007-8-30
状态 离线
『第 24 楼』:  



  Quote:
Originally posted by yoyodos at 2007-9-24 05:18 PM:
晕,以姓名作分隔符不就行了吗
在delims=后面写姓名,姓 名,姓  名。。。。就能得到后面的名字了啊

谢谢你回答,经过反复测试,做了适当调整,可以了。
你的代码适用性能是非常好的。再次感谢!

2007-9-24 18:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 25 楼』:  

我也来一段学习
@echo off
setlocal enabledelayedexpansion
     set mn=0
     for /f "tokens=1* delims=," %%i in (ab.txt) do (
     set data=%%i%%j
     set /a mn+=1
     for /f "tokens=1* delims=:" %%a in ('findstr /n .* cd.txt') do (
     if !mn! EQU  %%a    set data=!data:%%i=姓名"%%b",!
)
echo !data!>>c12.txt
)
pause

   此帖被 +2 点积分    点击查看详情   
评分人:【 123cainiao 分数: +2  时间:2007-9-25 16:32


2007-9-24 19:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
123cainiao
初级用户





积分 97
发帖 41
注册 2007-8-30
状态 离线
『第 26 楼』:  



  Quote:
Originally posted by terse at 2007-9-24 07:13 PM:
我也来一段学习
@echo off
setlocal enabledelayedexpansion
     set mn=0
     for /f "tokens=1* delims=," %%i in (ab.txt) do (
     set data=%%i%%j
     set /a mn+=1
     for  ...

以上所有回复的参考答案中terse给的适应性能最强,可以不加修改完全适应通用性文件的查找替换,只许需要把 姓名 字段替换为你要查找的即可.
谢谢terse

2007-9-25 13:25
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
123cainiao
初级用户





积分 97
发帖 41
注册 2007-8-30
状态 离线
『第 27 楼』:  问题的延伸,看看下面的情况会用到很多

如果把问题延伸,比如ab.txt文件只有这么一行
姓名"张三",ID'102' ,tel'0102211',0,25,11
现在cd.txt文件还是不变:
赵括
王彬
李铃
。。。。。
可否做到从ab.txt文件里替换第一行后的姓名后,直接可以复制这种格式,生成一个完全和cd.txt文件行数一致的文件ef.txt:
姓名"赵括",ID'102' ,tel'0102211',0,25,11
姓名"王彬",ID'102' ,tel'0102211',0,25,11
姓名"李铃",ID'102' ,tel'0102211',0,25,11
........

这里问题就不单单是对等行替换了,需要涉及复制,想来还是会复杂一些。

2007-9-25 13:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 28 楼』:  

@echo off
setlocal enabledelayedexpansion
     for /f "tokens=1* delims=," %%i in (ab.txt) do (
     set data=%%j
)
     for /f "tokens=1* delims=:" %%a in (cd.txt) do (
>>c12.txt echo 姓名"%%a",!data!
)
pause

   此帖被 +2 点积分    点击查看详情   
评分人:【 123cainiao 分数: +2  时间:2007-9-25 16:31


2007-9-25 14:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yoyodos
初级用户




积分 128
发帖 59
注册 2007-9-15
状态 离线
『第 29 楼』:  

terse回答的很好呀,哈,123cainiao还有问题没??我也练练

2007-9-25 14:29
查看资料  发送邮件  发短消息 网志  OICQ (52721292)  编辑帖子  回复  引用回复
123cainiao
初级用户





积分 97
发帖 41
注册 2007-8-30
状态 离线
『第 30 楼』:  



  Quote:
Originally posted by yoyodos at 2007-9-25 02:29 PM:
terse回答的很好呀,哈,123cainiao还有问题没??我也练练

呵呵,谢谢各位回答,不同的程序表达方式,达到相同的目的,值得好好研究.
   顺祝大家中秋快乐,合家幸福!

2007-9-25 16:37
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] [4] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: