Board logo

标题: [文本处理] [已解决]BAT怎样找到连续使用句号的句子并显示出来? [打印本页]

作者: 每天几分    时间: 2012-10-30 20:21     标题: [已解决]BAT怎样找到连续使用句号的句子并显示出来?

本帖最后由 每天几分 于 2012-10-31 15:36 编辑

比如:
    青云山脉巍峨高耸,虎踞中原,山阴处有大河“洪川”,山阳乃重镇“河阳城”,扼天下咽喉,地理位置十分重要。
    青云山连绵百里。峰峦起伏。最高有七峰。高耸入云。平日里只见白云环绕山腰。不识山顶真容。
青云山山林密布。飞瀑奇岩。珍禽异兽。
在所多有。景色幽险奇峻。天下闻名。

    只是更有名的,却是在这山上的修真门派——青云门。
    青云一脉历史悠久,创派至今已有两千余年,为当今正邪两道之首。据说开派祖师本是一个江湖相师,半生潦倒,郁郁不得志。在其四十九岁那年,云游四方,路经青云山,一眼便看出此山钟灵奇秀,聚天地灵气,是一绝好之地。当下立刻登山,餐风饮露,修真炼道,未几,竟于青云山深处一处密洞内,得到一本无名古卷,上载各般法门妙术,艰深枯涩,却是妙用无穷,威力巨大。
……
==========================
要求:将红色字部分(即未用逗号,连续使用句号)的句子显示到一个新文本中。

谢谢楼下3位!
作者: apang    时间: 2012-10-30 21:14

保存为vbs,试试看吧
  1. Set FSO = CreateObject("Scripting.FileSystemObject")
  2. Set File = FSO.OpenTextFile("a.txt",1)
  3. Do Until File.AtEndOfStream
  4.    Text = File.ReadLine
  5.    A = Split(Text,"。")
  6.    B = Split(Text,",")
  7.    If UBound(A) > 1 And Ubound(B) = 0 Then
  8.       Str = Str & Text & vbCrLf
  9.    End If
  10. Loop
  11. FSO.CreateTextFile("b.txt",True).Write Str
复制代码

作者: CrLf    时间: 2012-10-30 22:36

vbs 用正则可能更方便些:
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. text = fso.OpenTextFile("a.txt",1).ReadAll
  3. With New RegExp
  4. .Global = True
  5. .MultiLine = True
  6. .Pattern = "^[^,]+$"
  7. Set ar = .Execute(text)
  8. End With
  9. For Each a In ar
  10. str = str & a & vbCrLf
  11. Next
  12. fso.CreateTextFile("b.txt",True).Write str
复制代码

作者: wc726842270    时间: 2012-10-31 03:23

即然L上给了VBS的方法,我就来个P的吧,至于效率么,不适用于大的文件
只是根椐你的描述所写,
  1. @echo off
  2. findstr /v /i "," a.txt|findstr /i ".*。.*。"
  3. pause
复制代码

作者: CrLf    时间: 2012-10-31 17:01

回复 4# wc726842270


    findstr 匹配gbk宽字节时有一点小问题,因为它实际上是逐字节匹配的,所以经常可能得出错误的结果,这种情况建议用 find 代替
作者: wc726842270    时间: 2012-11-1 02:10

回复 5# CrLf


    确实是字节,不过还请举例说明
作者: CrLf    时间: 2012-11-1 03:38

本帖最后由 CrLf 于 2012-11-1 03:40 编辑

回复 6# wc726842270


   http://bbs.bathome.net/viewthread.php?tid=507
   http://bbs.bathome.net/viewthread.php?tid=7629&
findstr 搜索宽字符时,无开关有时会常出现搜不到匹配行的现象(使用多个关键词时尤为明显),而加了开关后容易导致错误匹配,比如:
  1. @echo off
  2. findstr /r "。" %0
  3. :: #
  4. pause
复制代码
这是因为 "。" 的 hex 为 A1 A3,而 " #" 则是 A1 A1 A3 A3,findstr 按 gbk 逐字节匹配的时候发现后者符合前者的条件:A1 [A1 A3] A3,但其实这是错误的...而 find 貌似是以 unicode 逐字符匹配,反正不存在这个毛病

不过刚测试时发现错误匹配貌似是 /r 开关导致的,其他开关似乎没出现这个现象,看来使用 findstr 匹配宽字符时要尽量避免用正则
作者: wc726842270    时间: 2012-11-1 06:36

本帖最后由 wc726842270 于 2012-11-1 06:48 编辑

回复 7# CrLf


    学习了,最初学时,不知是何意。不过ZM也真够细心了,写完了之后也用ASCKII试了一下,不过没发现什么异常,看来还是少了
刚看到你的回贴时,想了一下,FINDSTR应该是传回了指针常量,之后逐字节对比,如果在NUL前全部匹配的话,则传回被操作字符串的首指针,
如果是只是查单的话,却实可能,不过随着长度的增加这种机率也下降了,不过不可否认,这却实是个漏动。
看来还是加个"/L”要保险啊




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