![Board logo](images/default/logo.gif)
标题: [文本处理] [已解决]批处理如何从txt文本每一行中提取特定内容并指定格式重新组合 [打印本页]
作者: vipd 时间: 2009-1-5 23:11 标题: [已解决]批处理如何从txt文本每一行中提取特定内容并指定格式重新组合
本帖最后由 pcl_test 于 2016-9-3 15:27 编辑
156642 江苏4区 408032025 6388521 角色名:┃_月./y 等级:24 金币:200,076 离线 2009-1-5 13:31:04
2009-1-5 13:56:36 XP-9
156610 江苏4区 807227071 aiwei15913506668 角色名:Sex‰小拽 等级:5 金币:1,500 离线 2009-1-5 13:30:03
2009-1-5 13:40:37 XP-9
156568 江苏4区 515746888 123456 角色名:NE、小白 等级:18 金币:75,067 离线 2009-1-5 13:27:33
2009-1-5 13:27:33 XP-9
先发3行 下面有文本附件..提取出的格式就是 ,中间的 项目之间用4个 - 隔开
帐号----密码----等级:X----金币:X 做3个事例 上面3行的如果整理完之后是这样的
408032025----6388521----等级:24----金币:200,076
807227071----aiwei15913506668----等级:5----金币:1,500
515746888----123456----等级:18----金币:75,067
最后谢谢各位大牛
作者: pusofalse 时间: 2009-1-5 23:32
- (@type "样本.txt"| wfr /r:"(.*江苏4区|角色名\S+)\s*|离线.*" /t:""|wfr /r:" +" /t:"----"|wfr /r:"-+$" /t|Findstr /i /v "xp-9$")>new.txt
- start "" "new.txt"
复制代码
wfr.exe下载:http://bbs.bathome.net/thread-1909-1-2.html
将wfr.exe放到此批处理所在目录中。
[ 本帖最后由 pusofalse 于 2009-1-5 23:34 编辑 ]
作者: namejm 时间: 2009-1-5 23:33
用如下代码基本可以满足你的需要,但是,却发现你提供的文本格式并不统一,导致提取到的部分记录不正确,不知道是你的数据原本就如此还是你有意做了修改。- @echo off
- for /f "tokens=3,4,6,7" %%i in (样本.txt) do if not "%%j"=="" echo %%i----%%j----%%k----%%l
- pause
复制代码
作者: namejm 时间: 2009-1-5 23:45
姑且认为你提供的数据是未改动过的原始数据,并且,前后带空格的“密”字不是密码的一部分,那么,使用如下代码应该可以满足你的需要:- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in (样本.txt) do (
- set "str=%%i"
- set "str=!str: 密 = !"
- for /f "tokens=3,4,6,7" %%j in ("!str!") do if not "%%k"=="" echo %%j----%%k----%%l----%%m
- )
- pause
复制代码
作者: fs999 时间: 2009-1-5 23:50
原帖由 namejm 于 2009-1-5 23:33 发表 ![](http://bbs.bathome.net/images/common/back.gif)
用如下代码基本可以满足你的需要,但是,却发现你提供的文本格式并不统一,导致提取到的部分记录不正确,不知道是你的数据原本就如此还是你有意做了修改。@echo off
for /f "tokens=3,4,6,7" %%i in (样本.txt) ...
155990 江苏4区 584214919 zxcc1991117zxcc 密 角色名:丿纯技术、糖 等级:22 金币:37,469 离线 2009-1-5 12:54:58
2009-1-5 12:58:58 XP-9
经过验证, 角色 前 有一个 密(空格),其它都类似。
小小代码,功能强大,佩服,可见我学艺未入门,我会努力了。
作者: fs999 时间: 2009-1-5 23:54
另外请教
do if not "%%j"=="" echo %%i----%%j----%%k----%%l
echo %%i----%%j----%%k----%%l --- ---> 这个我知道什么意思。
问题我不明白 do if not "%%j"=="" 的意思,可不可以解释一下呢?
谢谢
作者: namejm 时间: 2009-1-6 00:04
do 是 for 语句中的关键字,和 if 语句扯不上关系,而 if 是个单独的语句,应该单独分析。if not "%%j"=="" 的意思是:如果%%j的值为空的话,就……。
____________________________________
更正一下,应该是:如果%%j的值不为空的话,就……
作者: fs999 时间: 2009-1-6 09:27
if not "%%j"=="" 的意思是:如果%%j的值为空的话,就……
155990 江苏4区 584214919 zxcc1991117zxcc 密 角色名
以这个为例,它第一次附值是 %%i=155990 %%j="空格" ; 还是 %%j=江苏4区 ???
if not "%%j"=="" 是否应解释为 %%j 非空 ?
我将你的代码 if not "%%j"=="" 删除运行测试,得出的部分结果:
似乎没什么区别。。。
加上 if not "%%j"=="" 是不是保证 为了输出的准确性呢?
作者: namejm 时间: 2009-1-6 10:24
首先,应该更正一下我在7楼的说法,正确的说法是:如果%%j的值不为空的话,就……,原先的说法少了一个“不”字。
其次,%%i并不总是获取第一个空格之前的字符串,它取的是哪一节的字符串,是受delims=和tokens=双重控制的:delims=指定以什么样的字符作为字符串的分隔符,而tokens=则指定要获取的是哪些“节”,具体的解释请看本人写的 [系列教程]for语句从入门到精通 4楼。在3楼的这个例子中,因为没有出现 delims= ,所以,默认以空格或者跳格键作为字符串的分节符号,而tokens=3,4,6,7,则指明了只提取第3、4、6、7节字符串,所以,%%i取到的是584214919而非155990,%%j取到的是zxcc1991117zxcc而非空格。
之所以要使用 if not "%%j"=="" 语句,是因为要排除那些以日期打头的行——因为那些行最多只有3节,而没有第4节。
作者: fs999 时间: 2009-1-8 02:24
非常感谢楼上精致的解答,辛苦了!
我总于明白了 if not ""%%j""=="" 的意思了,
156642 江苏4区 408032025 6388521 角色名:┃_月./y 等级:24 金币:200,076 离线 2009-1-5 13:31:04
2009-1-5 13:56:36 XP-9 ----> 排除
156610 江苏4区 807227071 aiwei15913506668 角色名:Sex‰小拽 等级:5 金币:1,500 离线 2009-1-5 13:30:03
2009-1-5 13:40:37 XP-9 ----> 排除
156568 江苏4区 515746888 123456 角色名:NE、小白 等级:18 金币:75,067 离线 2009-1-5 13:27:33
2009-1-5 13:27:33 XP-9 ----> 排除
明白了!!谢谢
[ 本帖最后由 fs999 于 2009-1-8 02:29 编辑 ]
作者: qi5780113 时间: 2009-6-14 15:47
学习学习~~~~
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |