中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 帮忙解释代码:在QQ好友中寻找08年1至9月没有联系的好友
作者:
标题: 帮忙解释代码:在QQ好友中寻找08年1至9月没有联系的好友 上一主题 | 下一主题
bluemanlb
初级用户





积分 24
发帖 14
注册 2006-10-8
状态 离线
『楼 主』:  帮忙解释代码:在QQ好友中寻找08年1至9月没有联系的好友


for /f "tokens=2 delims=()" %%i  in (message.txt) do findstr "2008-0[1-9]-" 3120.txt ^| find "%%i" || echo %%i >>result.txt
上面代码的目的就是在QQ好友中寻找08年1至9月没有联系的好友的QQ。
其中message.txt里面的文件格式如下 :
消息对象:冰雪*~无情(229244313)
消息对象:♀恋依/珍(282162453)

3120.txt里面的内容就是我从QQ消息管理器里面导出QQ聊天记录文体.
我有如下的一些疑问,还望高手可以帮我解释一下,谢了.
1、程序中delims=()表示在文件中用()分隔,是不是所有含有“()”的行只能用"()"进行分隔,其中takens=1即为括号外面的内容,tokens=2就是括号里面的内容。例如上例中就是括号的QQ号?
2、这段代码: findstr "2008-0[1-9]-" 3120.txt ^| find "%%i"是不是就是在指定日期的聊天记录里查寻相关的QQ号码(即%%i变量)有没有聊天记录。但是我在DOS里试了一下,findstr "2008-0[1-9]-" 3120.txt 只能生成这样的文件格式:  2008-9-15 18:25:58 QQ名字
里面并没有QQ号,所以即使有聊天记录,上面的代码也是无法查到的吧?但为何程序可以实现其功能呢?望解释一下,谢了。



———————————————————————
转移自 DOS疑难解答 & 问题讨论 (解答室)
明显发错版块,予以扣分处理。
——管理员
———————————————————————



───────────────── 版务记录 ─────────────────
执行:HAT
操作:[20098-01-08]在帖子标题中增加搜索关键字;代码加code标签
说明:原标题"for的问题,请高手帮我解释一下下面的这段代码?"不利于论坛搜索
处罚:扣除2点积分
提示:建议阅读以下帖子
{1415}提问的智慧
{7326}论坛新手必读,所有人的基本行为准则
{22703}请不要做浮躁的人
{32667}[愤怒]那些连标题都写不清楚的人们啊,你们醒醒吧
{32825}本版严厉整顿烂帖
───────────────── 版务记录 ─────────────────


[ Last edited by HAT on 2009-1-8 at 11:22 ]

   此帖被 -8 点积分    点击查看详情   
评分人:【 DOSroot 分数: -6  时间:2009-1-8 10:53
评分人:【 HAT 分数: -2  时间:2009-1-8 11:22


2009-1-8 10:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bluemanlb
初级用户





积分 24
发帖 14
注册 2006-10-8
状态 离线
『第 2 楼』:  

有人帮我解答一下吗?谢了

2009-1-8 12:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
exzzz
初级用户

游手好闲 + 无所事事 ..



积分 194
发帖 167
注册 2007-4-30
状态 离线
『第 3 楼』:  



  Quote:
Originally posted by bluemanlb at 2009-1-8 10:23 AM:
for /f "tokens=2 delims=()" %%i  in (message.txt) do findstr "2008-0[1-9]-" 3120.txt ^| find "%%i" || echo %%i >>result.txt
上面代码的目的就 ...

我看的不是很明白。。。
第一个问题,【DELIMS=()】,是说以【(】或【)】符号为分隔符,takens=1表示取第一个分隔符之前的内容并赋值给%%i,takens=2,则第一到第二个分隔符之间的值赋值给%%i
举例:

("X(Y)Z)(") 中,如若takens=1,2,3,4    那么%%i就等于X,%%j等于Y,如果takens=2,3,4,那么 %%i等于Y,%%j等于Z
例如
for /f "takens=2 delims=()" %%i in ("X(Y)Z)(") do  echo %%i
结果等同于
for /f "takens=1 delims=()" %%i in ("X(Y)Z)(") do  echo %%j


第二个问题,你前面半截说的是对的,后面半截,因为我不知道你的txt文件的内容格式,所以无法解答了

2009-1-8 14:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bluemanlb
初级用户





积分 24
发帖 14
注册 2006-10-8
状态 离线
『第 4 楼』:  

EX.我的那个文件的格式就是QQ聊天记录导出来的文本格式,你可以导一下自己的QQ聊天记录,谢了.

2009-1-9 10:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
exzzz
初级用户

游手好闲 + 无所事事 ..



积分 194
发帖 167
注册 2007-4-30
状态 离线
『第 5 楼』:  

首先要指出,你这条语句不对,因为不论3120.txt是否包括所有人的聊天记录,执行的结果都是所有人都在result.txt中。原因自己考虑一下吧。


现在解释你第2个疑问。

如果findstr 在查找 2008-01到2008-09的时候成功,也就是该用户在此期间联系过,所以findstr直接显示包含这个时间的行,确实,这行不含有用户的号码。但也因此find XXXX会失败,因为||,执行前面命令失败,因此会执行【 echo 号码 >>result.txt】


但是如果findstr失败了呢?findstr就会提示提示【FINDSTR: 无法打开 XXXXXXX】,从而【find xxxxx “FINDSTR: 无法打开 XXXXXXX”】就成功了,因此就不会执行了 echo %%i 的命令。


其中的^和|以及||请自行参考
http://www.cn-dos.net/forum/view ... =%E7%AC%A6%E5%8F%B7

[ Last edited by exzzz on 2009-1-10 at 13:26 ]

2009-1-10 13:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
exzzz
初级用户

游手好闲 + 无所事事 ..



积分 194
发帖 167
注册 2007-4-30
状态 离线
『第 6 楼』:  


del /f /q result.txt&for /f "tokens=2 delims=()" %%i  in (friends.txt) do (findstr "2008-0[1-9]-" %%i.txt ^| find "%%i" || echo %%i>>result.txt)
把好友列表保存为friends.txt,例如其中包含 123456 这个号码
然后导出好友聊天记录,按号码命名,例如有123456.txt 这个聊天记录

再执行以上命令就可以了。

[ Last edited by exzzz on 2009-1-10 at 13:27 ]

2009-1-10 13:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: