中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 提取<title>与</title>之间的内容为新文件第一行,
« [1] [2] »
作者:
标题: 提取<title>与</title>之间的内容为新文件第一行, 上一主题 | 下一主题
loveid
初级用户





积分 38
发帖 15
注册 2008-4-21
状态 离线
『楼 主』:  提取<title>与</title>之间的内容为新文件第一行,

1,每个文件都要进行类似处理:
                        1,提取<title>与</title>之间的内容为新文件第一行,
                        2,提取<pre>与</pre>之间的内容并删除其中的空行赋给新文件第一行之后的行
                        3,把新文件改名为旧文件名。
2.我的系统是NT,未联网,这是在网吧求助,谢谢!
有几篇文章,是三毛的,我想把文章打到纸上看,文件名是这样的一些 01.TXT,02.TXT,03.TXT,...,88.TXT
他们是我用批处理处理了01.htm,02.htm,03.htm,...,88.htm(把他们的每个文件的后缀名改成.txt)的结果。每个文件内容都是这样的(复制一下内容到记事本,请调整“格式“为不要在自动换行处打勾):
04.txt内容如下:
<html>
<head><title>平沙漠漠夜带刀</title></head>
<body background="../../../../images/back-1.jpg" leftmargin="50">
<CENTER><B><FONT COLOR="#FF6666"><FONT POINT-SIZE="16">平沙漠漠夜带刀&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></FONT></B></CENTER>
<FONT SIZE=+1>
<pre>

    我们的三毛,走啊走的,走到撒哈拉去了,她的朋友们总要说她:“嗨!三毛,好好的
德文教授不干,何必呢!”她留学过西班牙,在马德里大学毕业,美国伊利诺州的公务员也
检定及格。

    可是,她一直说:我喜欢流浪。

    我初抵沙漠时,十分希望做世界第一个
......
  我大笑起来,笑得跌跌撞撞,踏到死人胸口上。我笑够了,对这个小家伙说:“胆子那
么小,又要半夜里出来祷告,快回去吧!”

    他对我弯了一下腰,走了。

    我发现,一只脚正踏在他母亲的左手。望望四周,月光没有了,那边坟场尽头处,似有
东西爬出来。我低叫一声快逃啊,一口气跑回家,撞开门来,将背靠在门上喘气,看看表,
四十分钟的路程,才十五分钟就跑回来了。就如朋友所说:“沙漠有趣的事情很多,你慢慢
的去发现吧!”今夜,真是够了。
</pre>
</font>
<center><A HREF="12.htm"><IMG SRC="up.gif" nosave border=0 alt="前" width="91" height="25"></A>      <img src="home.gif" alt="黄金书屋" nosave border=0></A>      <A HREF="14.htm"><IMG SRC="next.gif" alt="后" nosave border=0 width="176" height="25"></A></center>
</body>
</html>
我想把正文(即<pre>与</pre>之间的内容)打印出来,并在头上加上<title>与</title>之间的内容。
每个txt文件的格式都与上面的类似,有不同的地方在于<pre>与</pre>之间的内容和<title>与</title>之间的内容等,
我想求个批处理,要求把每个txt文件重新编辑成:
<title>与</title>之间的内容,另起一行
<pre>与</pre>之间的内容,并删除其中的空行
的格式,文件名不变。
变成如下的04.txt文件内容:
平沙漠漠夜带刀
    我们的三毛,走啊走的,走到撒哈拉去了,她的朋友们总要说她:“嗨!三毛,好好的
德文教授不干,何必呢!”她留学过西班牙,在马德里大学毕业,美国伊利诺州的公务员也
检定及格。
    可是,她一直说:我喜欢流浪。
    我初抵沙漠时,十分希望做世界第一个
......
  我大笑起来,笑得跌跌撞撞,踏到死人胸口上。我笑够了,对这个小家伙说:“胆子那
么小,又要半夜里出来祷告,快回去吧!”
    他对我弯了一下腰,走了。
    我发现,一只脚正踏在他母亲的左手。望望四周,月光没有了,那边坟场尽头处,似有
东西爬出来。我低叫一声快逃啊,一口气跑回家,撞开门来,将背靠在门上喘气,看看表,
四十分钟的路程,才十五分钟就跑回来了。就如朋友所说:“沙漠有趣的事情很多,你慢慢
的去发现吧!”今夜,真是够了。
简要的说,
1,每个文件都要进行类似处理:
                        1,提取<title>与</title>之间的内容为新文件第一行,
                        2,提取<pre>与</pre>之间的内容并删除其中的空行赋给新文件第一行之后的行
                        3,把新文件改名为旧文件名。

2.请教各位高手.

[ Last edited by loveid on 2008-5-27 at 01:41 PM ]

2008-5-27 13:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
loveid
初级用户





积分 38
发帖 15
注册 2008-4-21
状态 离线
『第 2 楼』:  明天再来请教

谢谢

2008-5-27 14:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
WANKOILZ
初级用户





积分 198
发帖 89
注册 2007-9-6
来自 重庆
状态 离线
『第 3 楼』:  

我来个比较粗糙的,因为发现除题目外,其余要抛弃的行都应该包含<或>,所以思路就是找题目和不包含<>的行。把以下P和txt文件放在一起然后运行,新文件在newfile里面:
@echo off&setlocal enabledelayedexpansion
md newfile
for /l %%i in (1,1,88) do (
  set num=%%i&set num=0!num!&set num=!num:~-2!
  if exist !num!.txt (
    for /f "delims=" %%j in ('findstr "\<<title>.*</title>\>" !num!.txt') do (
      set "str=%%j"
      set "str=!str:~13,-15!"
      echo !str!>newfile\new!num!.txt
    )
    findstr /v "[<>]" !num!.txt>>newfile\new!num!.txt
  )
)
pause


2008-5-27 15:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 4 楼』:  

上面的如果可以用  也可以直接改 HTM文件
@echo off
for /f "delims=" %%i in ('dir /b /a-d *.htm') do (
    for /f "tokens=3 delims=<>" %%a in ('findstr "\<<title>.*</title>\>" "%%i"') do >"%%~ni.txt" echo %%a
    findstr /v "^<" %%~nxi>>%%~ni.txt
)
pause



简单!简单!再简单!
2008-5-27 17:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
loveid
初级用户





积分 38
发帖 15
注册 2008-4-21
状态 离线
『第 5 楼』:  感谢感谢,我自己暂时是不懂的代码的.



  Quote:
Originally posted by WANKOILZ at 2008-5-27 03:28 PM:
我来个比较粗糙的,因为发现除题目外,其余要抛弃的行都应该包含<或>,所以思路就是找题目和不包含<>的行。把以下P和txt文件放在一起然 ...

就是 单独对04.txt运行后编辑出来的如下:
平沙漠漠夜带刀

    我们的三毛,走啊走的,走到撒哈拉去了,她的朋友们总要说她:“嗨!三毛,好好的
德文教授不干,何必呢!”她留学过西班牙,在马德里大学毕业,美国伊利诺州的公务员也
检定及格。

    可是,她一直说:我喜欢流浪。

    我初抵沙漠时,十分希望做世界第一个
......
  我大笑起来,笑得跌跌撞撞,踏到死人胸口上。我笑够了,对这个小家伙说:“胆子那
么小,又要半夜里出来祷告,快回去吧!”

    他对我弯了一下腰,走了。

    我发现,一只脚正踏在他母亲的左手。望望四周,月光没有了,那边坟场尽头处,似有
东西爬出来。我低叫一声快逃啊,一口气跑回家,撞开门来,将背靠在门上喘气,看看表,
四十分钟的路程,才十五分钟就跑回来了。就如朋友所说:“沙漠有趣的事情很多,你慢慢
的去发现吧!”今夜,真是够了。
没有去掉空行,想去掉空行的说,如不吝赐教,更加感谢

2008-5-28 15:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 6 楼』:  请放在当前目录下运行:


@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in ('dir /a-d /b *.txt') do (
    for /f "delims=" %%i in ('type %%a') do (
        set str=%%i
        if "!str:~6,7!"=="<title>" echo !str:~13,-15!>%%a
        if "!str:~-4!"=="pre>" set /a n+=1
        if !n! equ 1 if not "!str:~,5!"=="<pre>" echo !str!>>%%a
    )
    set n=0
)
echo 全部搞定!
pause>nul
[ Last edited by zw19750516 on 2008-5-28 at 05:08 PM ]



批处理之家新域名:www.bathome.net
2008-5-28 17:06
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by zw19750516 at 2008-5-28 17:06:
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in ('dir /a-d /b *.txt') do (
    for /f "delims=" %%i in ('type %%a') do (
        set str=%%i
   ...

上面是不行成任何临时文件的方法,但效率差点,如要效率高点,可修改如下:
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in ('dir /a-d /b *.txt') do (
    for /f "delims=" %%i in (%%a) do (
        set str=%%i
        if "!str:~6,7!"=="<title>" echo !str:~13,-15!>temp.txt
        if "!str:~-4!"=="pre>" set /a n+=1
        if !n! equ 1 if not "!str:~,5!"=="<pre>" echo !str!>>temp.txt
    )
    set n=0&del /q %%a&ren temp.txt %%~nxa
)
echo 全部搞定!
pause>nul
注:也请放在当前目录下运行。



批处理之家新域名:www.bathome.net
2008-5-28 17:15
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
loveid
初级用户





积分 38
发帖 15
注册 2008-4-21
状态 离线
『第 8 楼』:  

加工 WANKOILZ 兄的代码,部分的满足了我的要求,如下
@echo off&setlocal enabledelayedexpansion
md newfile
for /l %%i in (1,1,88) do (
  set num=%%i&set num=0!num!&set num=!num:~-2!
  if exist !num!.txt (
    for /f "delims=" %%j in ('findstr "\<<title>.*</title>\>" !num!.txt') do (
      set "str=%%j"
      set "str=!str:~13,-15!"
      echo  !str!>newfile\new!num!.txt
    )
    findstr /v "[<>]" !num!.txt>>newfile\new!num!.txt
  )
if exist newfile\new!num!.txt (
cd.>newfile\n!num!.txt
for /f "delims=" %%z in (newfile\new!num!.txt) do >>newfile\n!num!.txt echo %%z
                                )
del newfile\new!num!.txt
)
pause
我把全部要处理的文档传上来了,有兴趣的朋友可以试待处理的文章

要去抄写这个上传地址真麻烦,我对论坛不熟悉的说!

[ Last edited by loveid on 2008-5-29 at 04:13 PM ]

2008-5-29 16:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
WANKOILZ
初级用户





积分 198
发帖 89
注册 2007-9-6
来自 重庆
状态 离线
『第 9 楼』:  

去空行的话,用 findstr . a.txt>b.txt 这种方法比较简洁。
@echo off&setlocal enabledelayedexpansion
md newfile
for /l %%i in (1,1,88) do (
  set num=%%i&set num=0!num!&set num=!num:~-2!
  if exist !num!.txt (
    for /f "delims=" %%j in ('findstr "\<<title>.*</title>\>" !num!.txt') do (
      set "str=%%j"
      set "str=!str:~13,-15!"
      echo !str!>newfile\new!num!.txt
    )
    findstr /v "[<>]" !num!.txt>>newfile\new!num!.txt
    findstr . newfile\new!num!.txt>newfile\!num!.txt&del newfile\new!num!.txt
  )
)
pause
[ Last edited by WANKOILZ on 2008-5-29 at 06:43 PM ]

2008-5-29 18:37
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 10 楼』:  

不知楼主测试了我发的两段代码没有,是不是不行,还是怎么的,怎么就没回馈的了(我自己建了10个文件是测试全部成功的)



批处理之家新域名:www.bathome.net
2008-5-29 20:00
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 11 楼』:  



  Quote:
Originally posted by WANKOILZ at 2008-5-29 18:37:
去空行的话,用 findstr . a.txt>b.txt 这种方法比较简洁。
[code]@echo off&setlocal enabledelayedexpansion
md newfile
for /l %%i in (1,1,88) do (
  set num=%%i&set num=0 ...

findstr在处理文本字符上效率不及if,所以个人认为在处理大量字符时,尽量用if好一点。



批处理之家新域名:www.bathome.net
2008-5-29 20:01
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
WANKOILZ
初级用户





积分 198
发帖 89
注册 2007-9-6
来自 重庆
状态 离线
『第 12 楼』:  

zw兄的代码每行判断,文本数量多的时候恐怕效率比不上findstr吧.
我用以下代码测试10000个txt文件,结果findstr消耗 不到1秒,而if消耗 大于3秒。
测试代码:
@echo off&setlocal enabledelayedexpansion
::建10000个txt文件
for /l %%i in (1,1,10000) do (
(echo will sort
echo namejm)>%%i.txt
)

::测试findstr消耗时间
echo findstr:
echo %time%
findstr "jm" *.txt>nul
echo %time%

::测试if消耗时间
echo if:
echo %time%
for /l %%i in (1,1,10000) do (
  for /f "delims=" %%j in (%%i.txt) do (
    set "str=%%j"
    if "!str:~-2!"=="jm" echo jm>nul
  )
)
echo %time%
pause


2008-5-29 20:20
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 13 楼』:  



  Quote:
Originally posted by WANKOILZ at 2008-5-29 20:20:
zw兄的代码每行判断,文本数量多的时候恐怕效率比不上findstr吧.
我用以下代码测试10000个txt文件,结果findstr消耗 不到1秒,而if消耗 大于3秒。
测试 ...

楼上的测试代码有误,我认为要比较就要进行逐行判断,请测试以下代码(找出1.txt中所有以abcd开头的行并赋值为A):
@echo off
if exist 1.txt del /q 1.txt
for /l %%i in (1,1,100) do echo abcd cn-dos>>1.txt
for /l %%i in (1,1,100) do echo cn-dos abcd>>1.txt
echo findstr:
echo 当前时间:%time%
for /f "delims= " %%a in (1.txt) do echo %%a|findstr "abcd">nul&&set %%a=A
echo 当前时间:%time%
echo if:
echo 当前时间:%time%
for /f "delims= " %%a in (1.txt) do if "%%a" equ "abcd" set %%a=A
echo 当前时间:%time%
pause>nul
附我的测试结果如下:
findstr:
当前时间:20:52:38.78
当前时间:20:53:11.82
if:
当前时间:20:53:11.82
当前时间:20:53:11.82
[ Last edited by zw19750516 on 2008-5-29 at 09:08 PM ]



批处理之家新域名:www.bathome.net
2008-5-29 20:52
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
WANKOILZ
初级用户





积分 198
发帖 89
注册 2007-9-6
来自 重庆
状态 离线
『第 14 楼』:  

管道+findstr 这种方式效率低是肯定的,也是应该尽量避免的。
findstr需单独用,如findstr "" *.txt 这种形式才能体现其效率。
我认为zw兄的例子在findstr的常规使用范围之外。

2008-5-29 21:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 15 楼』:  



  Quote:
Originally posted by WANKOILZ at 2008-5-29 21:07:
管道+findstr 这种方式效率低是肯定的,也是应该尽量避免的。
findstr需单独用,如findstr "" *.txt 这种形式才能体现其效率。
我认为zw兄的例子在findstr的常规使用范围之外。

那请兄弟用findstr找出上述1.txt中以abcd开头的行吧。
ps:我费这么力气无非是要证明findstr在处理文本字符时效率比不上if,请兄弟不要误会了我的意思。

[ Last edited by zw19750516 on 2008-5-29 at 09:13 PM ]



批处理之家新域名:www.bathome.net
2008-5-29 21:09
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: