[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理如何从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  

最后谢谢各位大牛

学习学习~~~~

TOP

非常感谢楼上精致的解答,辛苦了!

我总于明白了 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 编辑 ]

TOP

  首先,应该更正一下我在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节。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

if not "%%j"=="" 的意思是:如果%%j的值为空的话,就……


155990 江苏4区 584214919 zxcc1991117zxcc 密 角色名

以这个为例,它第一次附值是 %%i=155990  %%j="空格"  ;  还是 %%j=江苏4区          ???

if not "%%j"==""   是否应解释为   %%j 非空 ?


我将你的代码  if not "%%j"=="" 删除运行测试,得出的部分结果:

似乎没什么区别。。。  

加上 if not "%%j"==""  是不是保证 为了输出的准确性呢?

TOP

  do 是 for 语句中的关键字,和 if 语句扯不上关系,而 if 是个单独的语句,应该单独分析。if not "%%j"=="" 的意思是:如果%%j的值为空的话,就……。

____________________________________

更正一下,应该是:如果%%j的值为空的话,就……
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

另外请教

do if not "%%j"=="" echo %%i----%%j----%%k----%%l

echo %%i----%%j----%%k----%%l                --- ---> 这个我知道什么意思。


问题我不明白 do if not "%%j"==""   的意思,可不可以解释一下呢?

谢谢

TOP

原帖由 namejm 于 2009-1-5 23:33 发表
  用如下代码基本可以满足你的需要,但是,却发现你提供的文本格式并不统一,导致提取到的部分记录不正确,不知道是你的数据原本就如此还是你有意做了修改。@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     

经过验证, 角色 前 有一个 密(空格),其它都类似。

小小代码,功能强大,佩服,可见我学艺未入门,我会努力了。

TOP

  姑且认为你提供的数据是未改动过的原始数据,并且,前后带空格的“密”字不是密码的一部分,那么,使用如下代码应该可以满足你的需要:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in (样本.txt) do (
  4.     set "str=%%i"
  5.     set "str=!str: 密 = !"
  6.     for /f "tokens=3,4,6,7" %%j in ("!str!") do if not "%%k"=="" echo %%j----%%k----%%l----%%m
  7. )
  8. pause
复制代码
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

  用如下代码基本可以满足你的需要,但是,却发现你提供的文本格式并不统一,导致提取到的部分记录不正确,不知道是你的数据原本就如此还是你有意做了修改。
  1. @echo off
  2. for /f "tokens=3,4,6,7" %%i in (样本.txt) do if not "%%j"=="" echo %%i----%%j----%%k----%%l
  3. pause
复制代码
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

  1. (@type "样本.txt"| wfr /r:"(.*江苏4区|角色名\S+)\s*|离线.*" /t:""|wfr /r:" +" /t:"----"|wfr /r:"-+$" /t|Findstr /i /v "xp-9$")>new.txt
  2. start "" "new.txt"
复制代码


wfr.exe下载:http://bbs.bathome.net/thread-1909-1-2.html

将wfr.exe放到此批处理所在目录中。

[ 本帖最后由 pusofalse 于 2009-1-5 23:34 编辑 ]
心绪平和,眼藏静谧。

TOP

返回列表