中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]文本比較替換,難度高問的很心虛(附圖內文简体)
« [1] [2] »
作者:
标题: [求助]文本比較替換,難度高問的很心虛(附圖內文简体) 上一主题 | 下一主题
leo1984
初级用户





积分 96
发帖 43
注册 2007-10-31
状态 离线
『楼 主』:  [求助]文本比較替換,難度高問的很心虛(附圖內文简体)

大哥们请体谅小弟架设网站要处理太多文本数据的问题,又是初学者,才刚学会一些基本的批次输出输入,但要处理需要比较文本的问题,完全难倒新手啊
小弟学习的东西太多太杂,批次处理弄的一个头两个大><
请老大哥们发慈悲心帮小老弟看再看一下


如下图,请按箭头的数字顺序


看完图不明白让小弟解说一下

话说从前从前有一个文本叫index1.log的母亲
它在外头生了很多个dat的文本孩子
这些dat孩子在外地赚了很多钱
于是要比对母亲第一个‖分隔符之前的帐户,和dat孩子的档名
如果相同,dat孩子就可以把自己文本内容的:之前的金钱数额,汇到母亲第一个‖分隔符的帐户之后
这样母亲就很开心啦

所以简单的说:

处理前:
index1.log文本里,每行以第一个‖之前的数字和同目录里的dat档的档名作比较

  Quote:
14724‖[布景美化]‖Windows XP 布景主题精选51 In 1 ‖3‖天武帝‖20071012 181007‖TATATA‖1‖1192178479‖

比较和14724相同的14724.dat档后,打开14724.dat文本内的:之前的数字

  Quote:
87:61.224.135.39

而这个数字便直接再汇入index1.log第一个‖之后

处理后:

  Quote:
14724‖87‖[布景美化]‖Windows XP 布景主题精选51 In 1 ‖3‖天武帝‖20071012 181007‖TATATA‖1‖1192178479‖

这难度实在太高了,小弟问的真的心很虚啊,但不问又不知道如何处理上万篇的文本><

十分麻烦老大哥帮忙谢谢

[ Last edited by leo1984 on 2007-11-1 at 03:57 PM ]

2007-11-1 15:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
abcd
银牌会员





积分 1436
发帖 739
注册 2007-10-11
状态 离线
『第 2 楼』:  


@echo off
for /f "tokens=1* delims=‖" %%i in (index1.log) do (
  if exist "%%i.dat" (
     for /f "delims=:" %%a in (%%i.dat) do echo %%i‖%%a‖%%j>>index2.log
   ) else (
     echo %%i‖%%j>>index2.log
     )
)
pause
这个意思??

[ Last edited by abcd on 2007-11-1 at 04:22 PM ]

2007-11-1 16:19
查看资料  发短消息 网志  OICQ (470237592)  编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 3 楼』:  

故事讲得很搞笑哦~~ ^_^

2007-11-1 18:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
leo1984
初级用户





积分 96
发帖 43
注册 2007-10-31
状态 离线
『第 4 楼』:  



  Quote:
Originally posted by abcd at 2007-11-1 04:19 PM:
[code]@echo off
for /f "tokens=1* delims=‖" %%i in (index1.log) do (
  if exist "%%i.dat" (
     for /f "delims=:" %%a in (%%i.dat) do echo %%i‖%%a‖%%j>> ...

大哥您不要整我啊
你一定是在變魔術
為何您寫的就這麼簡單
我可想了好半天哪@@"

感謝再感謝~願主保佑你~聖誕節快樂加新年快樂~    <<<<這小伙子瘋了

2007-11-1 21:11
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
leo1984
初级用户





积分 96
发帖 43
注册 2007-10-31
状态 离线
『第 5 楼』:  



  Quote:
Originally posted by lxmxn at 2007-11-1 06:06 PM:
故事讲得很搞笑哦~~ ^_^

我这么认真在说一个母亲的辛劳与孩子的孝顺
怎么变庵搞笑来的勒?! @@?

2007-11-1 21:15
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





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

改上面的试一下也一样
不过没有%%i.dat文件就不行了哦  呵呵  学习了
@echo off
for /f "tokens=1* delims=‖" %%i in (index1.log) do (
     for /f "delims=:" %%a in (%%i.dat) do echo %%i‖%%a‖%%j>>index.log
)
pause

[ Last edited by terse on 2007-11-1 at 10:22 PM ]

2007-11-1 22:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
leo1984
初级用户





积分 96
发帖 43
注册 2007-10-31
状态 离线
『第 7 楼』:  

@echo off
for /f "tokens=1* delims=∥" %%i in (index2.log) do (
for /f "tokens=5 delims=∥" %%a in (%%i.txt) do echo %%i∥%%a∥%%j>>index.log
)

我要抓取第五個∥字符
但是
for /f "tokens=5 delims=∥" %%a in (%%i.txt) do echo %%i∥%%a∥%%
這段tokens=5會把第五個字串抓出來,但是迴圈會繼續下去,因此連文本後面的的一起輸出來到index.log

請問為何同樣的寫法,tokens=5設為1時,就只會偵對第一行抓取
但設為5時,迴圈為何會繼續抓下去呢?

可以下載的的附件測試看,小老弟看的很困惑這是什麼魔法?

[ Last edited by leo1984 on 2007-11-2 at 04:02 AM ]

附件 1: 14536.txt (2007-11-2 04:01, 2.69 K,下载次数: 6)
2007-11-2 04:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
leo1984
初级用户





积分 96
发帖 43
注册 2007-10-31
状态 离线
『第 8 楼』:  

完了
研究整個晚上指令
只有skip只能指定跳過開頭幾行
沒有辦法直接指定第一行0.0"   (心頭一陣寒風吹過~~~~)

2007-11-2 06:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
abcd
银牌会员





积分 1436
发帖 739
注册 2007-10-11
状态 离线
『第 9 楼』:  

在楼主给的附件中根本就没有∥这个分隔符的。

不知道什么意思,还是用图说话吧

2007-11-2 10:45
查看资料  发短消息 网志  OICQ (470237592)  编辑帖子  回复  引用回复
terse
银牌会员





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

是不是这个意思呢?
附件下来我这里是乱码,没测试!
@echo off
for /f "tokens=1* delims=‖" %%i in (index2.log) do (
set i=%%i
call :doc
)
pause
goto :eof
:doc
for /f "tokens=5 delims=‖" %%a in (%i%.txt) do (
  if not defined line set "line=%%a"
)
echo,%line%>>indexa.log
set line=


2007-11-2 10:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
leo1984
初级用户





积分 96
发帖 43
注册 2007-10-31
状态 离线
『第 11 楼』:  

给abcd大哥
这个很难用图片来说明@@"

我来简单说明一下好了,我原本提供的图里,知道了dat里头只要取出87放到index1.log即可
http://img155.imageshack.us/img155/5489/snap085dz5.jpg

所以您给的
for /f "delims=:" %%a in (%%i.dat) do echo %%i‖%%a‖%%j>>index2.log

找到:这个分隔符后,因为bat文本里头只有一行
所以这段回圈也只能执行一次

但是小老弟我这次要从txt文本里取出第五个以为分隔符的字串,然后一样放到index2.log里

所以我修改成
  for /f "tokens=5 delims=" %%a in (%%i.dat) do echo %%i‖%%a‖%%j>>index2.log

但是我们都知道回圈会不停不停的执行
而这次txt的文本里不只有一行
他是这样子

JAN‖1‖SlySoft All In One 2007-09-10-小绵羊套餐‖绵羊狐狸又来了@1@,这是一定要收下的啦,谢啦<br>‖220.132.11.106‖2007/09/18/ 11:10:02‖jan@yahoo.com

...........

..........以此类推可能有好几行

因此txt文本里头有几行,它就取出多少行的字串到index2.log里

原本小弟需要的index2.log一行比较dat只有一行后取出一个字串放到index2.log里,是可行的

而这次index2.log一行比较txt有许多行后取出许多字串放到index2.log里,就不符合一比一的取字串的需求了

因此我说如何能让回圈指定只取txt第一行,就停止再取超过第一行的字串,但因为找不到指令而小弟很心寒

而感谢terse提供的指令,小老弟平常接触的都是变数和回圈等等网站程式,没想到原来DOS可以口语话的进行比较
if not defined line  set "line=%%a"

只要和line一样的才能进行回圈
同时也宣告line=%%a

但重点来啦~没有排出阵列,只取出%%a进行比较后输出
因此

处理前,txt文本里的确实取出220.132.11.106这字串了

JAN‖1‖SlySoft All In One 2007-09-10-小绵羊套餐‖绵羊狐狸又来了@1@,这是一定要收下的啦,谢啦<br>‖220.132.11.106‖2007/09/18/ 11:10:02‖jan@yahoo.com

但放到index2.log原本需要的是这样

处理后:
3041‖220.132.11.106‖1489‖[尚未分类]‖【2-25】Nelson 软 体 作 品(全是繁体中文的喔)‖2‖琉璃★幻童‖20070914 061000‖琉璃★幻童 ‖1‖1185452828‖

但是因为输出只有宣告
echo,%line%>>indexa.log

所以变成只留下
220.132.11.106

其他原本应有的字串变成被220.132.11.106取代掉了

所以小弟的苦恼是terse大哥确实宣告一定要比较过%%a才能取出字串,但是不能排出阵列啊@@

请老大哥再帮忙小老弟
(超高难度的,不是小老弟不认真学,只是搜索整个论坛,也找不到for能够指定第一行执行一次就停止的指令,这老弟还在研究中啊@@)

[ Last edited by leo1984 on 2007-11-2 at 12:18 PM ]

2007-11-2 12:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
leo1984
初级用户





积分 96
发帖 43
注册 2007-10-31
状态 离线
『第 12 楼』:  

看得懂小弟的意思吗?
小弟想不出要拍什么图来解释@@

2007-11-2 12:10
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
abcd
银牌会员





积分 1436
发帖 739
注册 2007-10-11
状态 离线
『第 13 楼』:  

如果用sed的话,方便很多,速度也快很多

發現臺灣把變量叫做變數,循環叫做逥圈

2007-11-2 12:18
查看资料  发短消息 网志  OICQ (470237592)  编辑帖子  回复  引用回复
abcd
银牌会员





积分 1436
发帖 739
注册 2007-10-11
状态 离线
『第 14 楼』:  

樓主的意思是只去對應文本的第一行里的第五個‖后的字符

是吧??

2007-11-2 12:19
查看资料  发短消息 网志  OICQ (470237592)  编辑帖子  回复  引用回复
junchen2
高级用户





积分 537
发帖 219
注册 2007-8-4
来自 杭州--半山
状态 离线
『第 15 楼』:  

for /f "tokens=5 delims=‖" %%a in ('sed -n 1p %%i.dat') do echo %%i‖%%a‖%%j>>index2.log

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


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



论坛跳转: