标题: [文本处理] [已解决]批处理如何从文本文件中提取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
- @echo off&setlocal enabledelayedexpansion
- for /l %%a in (0 1 9) do set #%%a=a
- for /f "delims=" %%i in (a.txt) do (
- set "str=%%i"
- set "str=!str:,=!"
- set "str=!str:;=!"
- set "str=!str: =!"
- set n=0&set "var="
- for /l %%a in (0 1 9) do set str=!str:%%a= %%a !
- for %%a in (!str!) do (
- if defined #%%a (set var=!var!%%a&set /a n+=1) else set var=&set n=0
- if !n! equ 6 echo !var!&set var=&set n=0
- ))
- pause
复制代码
作者: RuiIsRui 时间: 2009-7-12 22:01
哇~
不愧为超版啊!
谢谢~谢谢~谢谢~谢谢~谢谢~谢谢!
太谢谢你拉~
我搞了一天了!要大量获取、分类很多股票代码手动根本不可能,今天可以睡个安稳觉了!
我太高兴拉~
作者: tireless 时间: 2009-7-12 22:10
这个帖子的方法
http://www.cn-dos.net/forum/viewthread.php?tid=47506#pid333351- @echo off & setlocal enabledelayedexpansion
- for /f "tokens=*" %%a in (a.txt) do (
- set str=#%%a
- set str=!str:"=!
- set var=!str!
- for /l %%a in (0 1 9) do set var=!var:%%a=" "!
- for %%a in ("!var:""=!") do (
- set str=1!str:*%%~a=!
- set /a n=str
- if !n! geq 1000000 if !n! lss 10000000 echo !n:~1!
- )
- )
- pause
复制代码
作者: inittab 时间: 2009-7-12 22:14
用三方工具sed.exe- @echo off
- for /f "delims=" %%a in ('sed "s/[^0-9]/,/g" a.txt') do (
- for %%b in (,%%a,) do echo %%b>>b.txt
- )
- 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楼 的帖子
大概解释,有问题再问:- @echo off&setlocal enabledelayedexpansion
- for /l %%a in (0 1 9) do set #%%a=a //定义变量#0--#9
- for /f "delims=" %%i in (a.txt) do (
- set "str=%%i"
- set "str=!str:,=!" //去掉每一句中的,号
- set "str=!str:;=!" //去掉每一句中的;号
- set "str=!str: =!" //去掉每一句中的空格
- set n=0&set "var="
- for /l %%a in (0 1 9) do set str=!str:%%a= %%a ! //给文本中的每一个数字两旁加上空格
- for %%a in (!str!) do (
- if defined #%%a (set var=!var!%%a&set /a n+=1) else set var=&set n=0 //查看是否定义过#%%a,也就是看是否是数字,是数字就赋值给var;
- if !n! equ 6 echo !var!&set var=&set n=0 //当n为6时,显示var中的值。
- ))
- pause
复制代码
作者: 基拉freedom 时间: 2009-7-13 15:27
好强大 看来还是得多学习学习
作者: netbenton 时间: 2009-7-13 21:23
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in (a.txt) do (
- set "str=%%i"
- set "str=!str:股份= !" &rem 所有“股份”变格
- set "sts=!str!" &rem 复制一份数据
- for /l %%a in (0 1 9) do set "str=!str:%%a= !"&rem 其中一份所有数据变空格
- for %%a in (!str!) do set "sts=!sts:%%a= !" &rem 另外一份数据外的窜变空格
- for %%a in (!sts!) do (
- set var=%%a
- set "var=!var:~,5!!var:~-1,1!" &rem 则另外一份数据得到的就全为数据了
- if "!var!" equ "%%a" echo !var! &rem 只有为6位数的才提取
- ))
- 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://bathome.net./) |
Powered by Discuz! 7.2 |