Board logo

标题: [文本处理] [已解决]批处理如何从文本文件中提取6位数字 [打印本页]

作者: RuiIsRui    时间: 2009-7-12 20:03     标题: [已解决]批处理如何从文本文件中提取6位数字

有文本文件a.txt,内容为:

601600中铝业600595中孚实业000807云铝股份600362江西铜业000878云南铜业000630铜陵有色601168西部矿业
600019宝钢份000898股份600808马钢  股份600005武钢股份000825太不锈000932华菱钢铁000709唐份600010包钢股份

运行批处理后得到结果后储存以b.txt中,结果为:

601600
600595
000807
600362
000878
000630
601168
600019
000898
600808
600005
000825
000932
000709
600010

[ 本帖最后由 RuiIsRui 于 2009-7-13 23:35 编辑 ]
作者: namejm    时间: 2009-7-12 21:05

  同一行中没有任何分隔符吗?
  数据格式决定了代码的编写,请在顶楼上传原始数据的部分内容,以便分析。
作者: RuiIsRui    时间: 2009-7-12 21:20

同一行中没有任何分隔符,且无规律,只能考批处理识别数字来完成,但不知道批处理如何识别数字。
作者: 随风    时间: 2009-7-12 21:41

  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (0 1 9) do set #%%a=a
  3. for /f "delims=" %%i in (a.txt) do (
  4.    set "str=%%i"
  5.    set "str=!str:,=!"
  6.    set "str=!str:;=!"
  7.    set "str=!str: =!"
  8.    set n=0&set "var="
  9.    for /l %%a in (0 1 9) do set str=!str:%%a= %%a !
  10.    for %%a in (!str!) do (
  11.       if defined #%%a (set var=!var!%%a&set /a n+=1) else set var=&set n=0
  12.       if !n! equ 6 echo !var!&set var=&set n=0
  13. ))
  14. pause
复制代码

作者: RuiIsRui    时间: 2009-7-12 22:01

哇~
不愧为超版啊!

谢谢~谢谢~谢谢~谢谢~谢谢~谢谢!

太谢谢你拉~

我搞了一天了!要大量获取、分类很多股票代码手动根本不可能,今天可以睡个安稳觉了!

我太高兴拉~
作者: tireless    时间: 2009-7-12 22:10

这个帖子的方法
http://www.cn-dos.net/forum/viewthread.php?tid=47506#pid333351
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "tokens=*" %%a in (a.txt) do (
  3.   set str=#%%a
  4.   set str=!str:"=!
  5.   set var=!str!
  6.   for /l %%a in (0 1 9) do set var=!var:%%a=" "!
  7.   for %%a in ("!var:""=!") do (
  8.     set str=1!str:*%%~a=!
  9.     set /a n=str
  10.     if !n! geq 1000000 if !n! lss 10000000 echo !n:~1!
  11.   )
  12. )
  13. pause
复制代码

作者: inittab    时间: 2009-7-12 22:14

用三方工具sed.exe
  1. @echo off
  2. for /f "delims=" %%a in ('sed "s/[^0-9]/,/g" a.txt') do (
  3. for %%b in (,%%a,) do echo %%b>>b.txt
  4. )
  5. start b.txt
复制代码


或:

sed -e "s/[^0-9]\{1,\}/\n/g" a.txt | sed "/^$/d">b.txt

[ 本帖最后由 inittab 于 2009-7-12 22:45 编辑 ]
作者: Lumiere    时间: 2009-7-13 08:58

尼古拉斯凯奇大哥能不能解释下代码啊?
作者: keen    时间: 2009-7-13 13:08     标题: 回复 8楼 的帖子

大概解释,有问题再问:
  1. @echo off&setlocal enabledelayedexpansion  
  2. for /l %%a in (0 1 9) do set #%%a=a    //定义变量#0--#9
  3. for /f "delims=" %%i in (a.txt) do (
  4.    set "str=%%i"
  5.    set "str=!str:,=!"                                //去掉每一句中的,号
  6.    set "str=!str:;=!"                               //去掉每一句中的;号
  7.    set "str=!str: =!"                               //去掉每一句中的空格
  8.    set n=0&set "var="
  9.    for /l %%a in (0 1 9) do set str=!str:%%a= %%a !        //给文本中的每一个数字两旁加上空格
  10.    for %%a in (!str!) do (
  11.       if defined #%%a (set var=!var!%%a&set /a n+=1) else set var=&set n=0       //查看是否定义过#%%a,也就是看是否是数字,是数字就赋值给var;
  12.       if !n! equ 6 echo !var!&set var=&set n=0                //当n为6时,显示var中的值。
  13. ))
  14. pause
复制代码

作者: 基拉freedom    时间: 2009-7-13 15:27

好强大 看来还是得多学习学习
作者: netbenton    时间: 2009-7-13 21:23

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do (
  3.    set "str=%%i"
  4.    set "str=!str:股份= !" &rem 所有“股份”变格
  5.    set "sts=!str!" &rem 复制一份数据
  6.    for /l %%a in (0 1 9) do set "str=!str:%%a= !"&rem 其中一份所有数据变空格
  7.    for %%a in (!str!) do set "sts=!sts:%%a= !" &rem 另外一份数据外的窜变空格
  8.    for %%a in (!sts!) do (
  9. set var=%%a
  10. set "var=!var:~,5!!var:~-1,1!" &rem 则另外一份数据得到的就全为数据了
  11. if "!var!" equ "%%a" echo !var! &rem 只有为6位数的才提取
  12. ))
  13. pause
复制代码

作者: Lumiere    时间: 2009-7-16 15:19     标题: 回复 9楼 的帖子

多谢巡查解释啦,怪自己太懒,经过你标示下再看其实就很简单了,不过随风兄代码里最后一个if句中的set var=&set n=0有些多余吧,前面的if defined里面不是有了么。还有啊,set n=0是定义数字,为什么不用格式 sep /a呢?这样不会出错的么?
作者: Batcher    时间: 2009-7-16 18:09     标题: 回复 12楼 的帖子

1、要判断它是否多余,很简单,把它删掉,看看代码还能正常工作么?
2、set命令的帮助里面没有提到定义数字必要使用/a开关吧?
作者: Lumiere    时间: 2009-7-18 15:11     标题: 回复 13楼 的帖子

亲爱的管理员batcher兄,我又对了,确实是不写那个句命令也可以,但是我不敢说是多余的,也许处于代码严谨性的考虑,是吧?呵呵,两次都是你让我自己删除去测试,你就不能直接告诉我啥,省的麻烦了,再说,你们技术那么好,有你们亲口肯定的话,比我自己去测试得出的结果更让人心定。
作者: netbenton    时间: 2009-7-19 19:14

有句话:
“授人鱼,不如授人以渔”
自己做过,学会方法才是最重要的,不是吗?




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2