![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-09-15 13:18 |
共 47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,268 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [已结][求助] - 文本中提取指定的内容(位置会变动的) |
| 可打印版本 4,459 / 20 |
| 第1楼 h2o | 发表于 2006-10-16 12:24 |
| 初级用户 发帖 18 积分 44 | |
|
[已结][求助] - 文本中提取指定的内容(位置会变动的) input.txt
-------------- <input name=id value=1842 type=hidden> -------------- 我想要得到 value 后面的那个值 1842 用的代码是: FOR /F "tokens=3" %%a IN (input.txt) do ( echo id=%%a ) 可是 后来测试几个 发现 input.txt 中的内容是会这样变化的:( input.txt 这个文件也是 find 一个网页生成的 ) <input type=hidden name=id value=1842> 原来的代码 就不成了 盼望朋友们指点迷津 谢谢你们了 ==================================== 回复 2 楼 namejm 朋友, 先谢谢 namejm 朋友的热心帮助 谢谢你 我刚测试了下代码 @echo off setlocal enabledelayedexpansion FOR /F "tokens=1-3* delims==" %%i IN (input.txt) do ( set var1=%%i set var2=%%j set var3=%%k set var4=%%l echo !var1:~1,1!|findstr /r "">nul && echo !var1:~0,4! echo !var2:~1,1!|findstr /r "">nul && echo !var2:~0,4! echo !var3:~1,1!|findstr /r "">nul && echo !var3:~0,4! echo !var4:~1,1!|findstr /r "">nul && echo !var4:~0,4! ) pause 这个真的可以提取到数字 不过 那个 value 的值长好象是不固定的 会有蛮大数字出现的情况 第二个代码 我用下面这个内容测试 <input type=hidden name=id value=465974855> 输出这样: value=465974855~0,1intercept " ~1 " ps:呵呵 这个代码我的机子运行起来有点久 -_-|| 我的系统是 sp2 我之前1楼的问题描述有点模糊 提供的信息不够多 我补充点点 ^-^ 我测试了几个 input.txt ( 单行的文本 ) 目前为止 发现内容是类似这样的: 情况 a: <input type=hidden name=id value=465974855> <input type=hidden name=id value=1820988170> <input type=hidden name=id value=1008964101> 情况 b: <input name=id value=465974855 type=hidden> <input name=id value=1820988170 type=hidden> value 的值的位数好象是变化的 还有一个,似乎只有两种不同的情况,就是 type=hidden 的这个在的位置不同,像这样的情况,可不可以判断 type=hidden 在的位置 然后分情况用这个来处理呢? 情况 a: FOR /F "tokens=4" %%a IN (input.txt) do ( echo id=%%a ) 情况 b: FOR /F "tokens=3" %%a IN (input.txt) do ( echo id=%%a ) 呵呵 大家别笑 我想到的法子都是比较那个的 =========结束语======================= 在论坛朋友们的热心帮助下 又解决了一问题 点拨大恩无以回报 唯有…… 谢谢 ![]() [ Last edited by h2o on 2006-10-17 at 01:55 ] |
|
| 第2楼 namejm | 发表于 2006-10-16 14:22 |
| 荣誉版主 发帖 1,737 积分 5,226 来自 成都 | |
|
假设一条记录中只有一个数字,并且数字是4位的,那么,用下面的代码可以简单地实现提取数字:
另外,还可以通过探测每一个字符的类型来获得数字,此时数字位数可以不受限制,不过效率十分低下: [ Last edited by namejm on 2006-10-17 at 00:45 ] |
|
| 第3楼 h2o | 发表于 2006-10-16 16:39 |
| 初级用户 发帖 18 积分 44 | |
|
谢谢 namejm 版主的热心帮助 谢谢你
1 楼我原来提供的信息不多 现在作了补充了 请朋友们帮忙分析一下 ^-^ |
|
| 第4楼 pengfei | 发表于 2006-10-16 21:30 |
| 银牌会员 发帖 485 积分 1,218 来自 湖南.娄底 | |
|
楼主的文本的内容不是很清楚, 请测试...
|
|
| 第5楼 无奈何 | 发表于 2006-10-16 22:22 |
| 荣誉版主 发帖 356 积分 1,338 | |
|
我也补充一个,不依赖字符前后关系,会获取 value= 后的任意值。
但是批处理在处理较大文本时效率低下,GREP 处理你的这个问题非常简单,你可以不用 find 过滤内容,而直接用 grep 提取。 Grep 下载地址:http://unxutils.sourceforge.net/UnxUpdates.zip |
|
| 第6楼 namejm | 发表于 2006-10-17 00:37 |
| 荣誉版主 发帖 1,737 积分 5,226 来自 成都 | |
|
无奈何第5楼的代码十分高效,充分利用了shift来对参数进行改位操作,去掉敏感字符的方法也比较巧妙,以后获取指定位置的字符串可以套用这个模式。建议大家人手一份,妥善收藏^_^。
|
|
| 第7楼 namejm | 发表于 2006-10-17 00:47 |
| 荣誉版主 发帖 1,737 积分 5,226 来自 成都 | |
|
回顶楼:
第二个代码 我用下面这个内容测试 因为我少了一个判断字符串是否结束的条件,所以会造成显示错误,现在已经修正,请重新测试2F的代码。 |
|
| 第8楼 vkill | 发表于 2006-10-17 00:53 |
| 金牌会员 发帖 1,744 积分 4,103 来自 甘肃.临泽 | |
|
无奈何斑竹的代码我还是看不懂,复制下来回去研究
shift 这个是什么意思?后面什么也没有?不解 [ Last edited by he200377 on 2006-10-17 at 02:04 ] |
|
| 第9楼 h2o | 发表于 2006-10-17 01:52 |
| 初级用户 发帖 18 积分 44 | |
|
to pengfei 朋友,
谢谢你,你提供的代码测试ok, ----------------------------------- to 无奈何 朋友, 谢谢你,你提供的代码 和 工具都测试ok, ----------------------------------- to namejm 朋友, 谢谢你,更新过的代码2 测试已经ok了, ----------------------------------- 呵呵 惭愧 惭愧 我技术实在不行,复杂点的 暂时 还没分析明白,这个大致看明白了: @echo off setlocal enabledelayedexpansion for /f "tokens=1-7 delims== " %%i in ('findstr /i /c:"value" input.txt') do ( if not "%%m"=="id" echo %%m if not "%%o"=="hidden>" set ii=%%o & echo !ii:~0,-2! ) pause 哈哈哈…… 我得找找 setlocal 的用法来学习下先 谢谢 谢谢楼上所有的大家 谢谢 namejm, pengfei, 无奈何 几位热心朋友 谢谢 大家费心了 送一个歌曲大家 聊表心意 ^-^ ![]() 献上一曲 |
|
| 第10楼 9527 | 发表于 2006-10-17 02:59 |
| 银牌会员 发帖 438 积分 1,185 来自 北京 | |
|
我也顺便来一个,大体跟无奈何的一致,不过有些细节不太一样
@echo off setlocal enabledelayedexpansion for /f "delims=" %%a in (1.txt) do ( set "a=%%a" set "a=!a:>= !" set "a=!a:*value=!" call :ok !a! ) goto :eof :ok for /f "delims== " %%x in ("%1") do echo %%x goto :eof |
|
| 第11楼 redtek | 发表于 2006-10-17 03:26 |
| 金牌会员 发帖 1,147 积分 2,902 | |
|
顶一个~:)
|
|
| 第12楼 lxmxn | 发表于 2006-10-17 03:35 |
| 版主 发帖 4,938 积分 11,386 | |
|
我也顶一个~ 刚开始以为这个问题很难下手,但是看了几个高手的代码之后,深感敬佩之意,受教中………… |
|
| 第13楼 redtek | 发表于 2006-10-17 03:43 |
| 金牌会员 发帖 1,147 积分 2,902 | |
Originally posted by pip at 2006-10-17 02:59: pip兄的代码非常精彩~:) pip兄call的代码内可以不要过滤=号的部分, %1...%9接收参数的时候会自动滤掉“,”逗号和空格还有自动滤掉等号~:) 帮PIP兄代码中去掉了一部份:) 帮pip的代码去掉了call内过滤=号的部分:) |
|
| 第14楼 pengfei | 发表于 2006-10-17 04:07 |
| 银牌会员 发帖 485 积分 1,218 来自 湖南.娄底 | |
|
pip兄的思路很独特, 把value前面的所有字符去掉, 这样需要得到的字符就会出现在最前面, 在提取时省了不少麻烦.
但也有一个缺陷, 当没有value行时数据无效, 所以得先用findstr过滤掉不需要的行. |
|
| 第15楼 redtek | 发表于 2006-10-17 04:18 |
| 金牌会员 发帖 1,147 积分 2,902 | |
|
越来越精彩了~:)
接着顶~:) |
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |