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

[文本处理] [已解决]求助批处理怎样取多个同一关键词行的下一行

某崖的小说遇到值的读的,想提取到一文本集中阅读楼主。
多个网页下载合并后,已提取到源码内容为   发言人  下一行为发言内容。由于网友回贴,造成如下示例的内容间杂。所以还需要提取楼主的发言并其他加工。格式大致如下

<divclass="atl-info"><span>楼主:<ahref="http://www
<divclass="bbs-contentclearfix">  爷爷是传承五代人的  这行留
<divclass="atl-info"><span><strongclass="host">楼主</strong>:<ahref="http://www
<divclass="bbs-content">  床尾站着一小仙,男,中批  这行留
<divclass="atl-info"><span><strongclass="host">其他发言人</strong>
<divclass="bbs-content">  其他发言人的发言,特点长短不一,也可能引用楼主大段文字
<divclass="atl-info"><span><strongclass="host">楼主</strong>:<ahref="http://www
<divclass="bbs-content"><br>  <imgsrc="http://static.tianyaui.com/img/static/2011/imgloading.gif"title="点击图片  这行留
<divclass="atl-info"><span><strongclass="host">楼主</strong>:<ahref="http://www
<divclass="bbs-content">  那日入定,爷爷带  这行留
  1. @echo on&&setlocal enabledelayedexpansion
  2. for /f "tokens=1 delims=:" %%i in ('findstr /n "楼主" 33.txt') do (
  3.   echo 楼主标志的行号 %%i
  4.   set /a xy=%%i+1
  5.   set js=
  6. for /f "delims=" %%m in ("33.txt") do (
  7.   set /a js+=1
  8.   if !xy!==!js! echo %%m>>44.txt
  9.   echo 标准!xy!  计数!js!
  10. )
  11. )
  12. pause
复制代码
我尝试写的代码,计数!js!永远为 1,因此提不到楼主发言。所以求助,感谢给予帮助。     结贴时对上面略改
目的,学习批处理

上面这段文本最后提取出来的是什么样的?

TOP

回复 2# pd1
要2  4  8  10行,即有楼主的下一行。
目的,学习批处理

TOP

回复 3# hlzj88


    我意思就谁要行号还是内容,要内容的话<divclass="bbs-contentclearfix">   <divclass="bbs-conte   这些内容全部都留着?

TOP

如不介意第3方工具gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe ),假设下载合并后的文件为“1.txt”,则以下代码可实现
  1. gawk "{if(A)if(B!=$0)if(NF){$0=gensub(/<.*>[ \t]*/,\"\",\"g\");print};A=0}/^楼主/{A=1;B=$0}" 1.txt>2.txt
复制代码
1

评分人数

TOP

本帖最后由 pd1 于 2022-10-22 15:36 编辑

上面是行号,下面的是内容
  1. <# :
  2. @echo off
  3. powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0' |Out-String|Invoke-Expression"
  4. pause
  5. #>
  6. $a=gc .\333.txt
  7. 0..($a.Length-1) |%{if($a[$_].contains(">楼主")){$_+2}}
复制代码
  1. <# :
  2. @echo off
  3. powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0' |Out-String|Invoke-Expression"
  4. pause
  5. #>
  6. $a=gc .\333.txt
  7. 0..($a.Length-1) |%{if($a[$_].contains(">楼主")){$a[$_+1]}}
复制代码
1

评分人数

TOP

TOP

回复 3# hlzj88


    如下代码,可以达到楼主你的要求,在55.txt内,文字前面内容未去除
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1 delims=" %%k in ('findstr /n .* 33.txt')do (echo %%k>>44.txt)
  4. for /f "delims=:" %%i in ('findstr /n .">楼主" 33.txt') do (
  5.   echo 楼主标志的行号 %%i
  6.   set /a xy=%%i+1
  7. for /f "tokens=1* delims=:" %%m in ('findstr .* 44.txt')do (
  8. set tt=%%m
  9. if !xy!==!tt! echo %%n>>55.txt
  10. )
  11. )
  12. del /f/q 44.txt
  13. pause
复制代码
最终结果(55.txt内容):
  1. <divclass="bbs-contentclearfix">  爷爷是传承五代人的
  2. <divclass="bbs-content">  床尾站着一小仙,男,中批
  3. <divclass="bbs-content"><br>  <imgsrc="http://static.tianyaui.com/img/static/2011/imgloading.gif"title="点击图片
  4. <divclass="bbs-content">  那日入定,爷爷带
复制代码
1

评分人数

    • hlzj88: 谢谢,就是要这样的结果技术 + 1

TOP

回复 3# hlzj88


   补充去除文字外的字符:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1 delims=" %%k in ('findstr /n .* 33.txt')do (echo %%k>>44.txt)
  4. for /f "delims=:" %%i in ('findstr /n .">楼主" 33.txt') do (
  5.   echo 楼主标志的行号 %%i
  6.   set /a xy=%%i+1
  7. for /f "tokens=1* delims=:" %%m in ('findstr .* 44.txt')do (
  8. set tt=%%m
  9. if !xy!==!tt! echo %%n>>55.txt
  10. )
  11. )
  12. del /f/q 44.txt
  13. for /f "tokens=1* delims=>  " %%a in ('findstr .* 55.txt')do (
  14. echo %%b>>66.txt
  15. )
  16. pause
复制代码
最终结果(66.txt内容):
  1. 爷爷是传承五代人的
  2. 床尾站着一小仙,男,中批
  3. <br>  <imgsrc="http://static.tianyaui.com/img/static/2011/imgloading.gif"title="点击图片
  4. 那日入定,爷爷带
复制代码

TOP

谢谢楼上的各位,是要那些行的所有内容。
目的,学习批处理

TOP

回复 10# hlzj88


    那8楼符合,你试试

TOP

回复 10# hlzj88


   
如果所有信息都保留,5楼的可简化为
  1. gawk "A;A=0;/^楼主/{A=1}" 1.txt>2.txt
复制代码

TOP

回复 12# hfxiang


    好精简,不过我刚特意下载试了下,生成的2.txt/3.txt文件内为空且会变成UTF-8格式。是不是代码运用错了?
  1. @echo off
  2. gawk "{if(A)if(B!=$0)if(NF){$0=gensub(/<.*>[ \t]*/,\"\",\"g\");print};A=0}/^楼主/{A=1;B=$0}" 33.txt>2.txt
  3. pause
  4. gawk "A;A=0;/^楼主/{A=1}" 33.txt>3.txt
  5. pause
复制代码

TOP

回复 13# fzp070


   
脚本及代处理文件(如你的“33.txt”)均需确保为ANSI编码格式方可

TOP

回复 14# hfxiang


   文本和批处理,都是ANSI格式的,而且我提前准备了ANSI格式的2.txt和3.txt,待批处理运行后,就变成空的了,而且格式自动转为UTF-8了,你可以亲自试试。谢谢!

TOP

返回列表