Board logo

标题: [文本处理] 批处理怎样删除文字纵列重复的行? [打印本页]

作者: leo198444    时间: 2011-5-28 06:25     标题: 批处理怎样删除文字纵列重复的行?

请教我有一文本内有纵列的行要判断处理

第一个问题

找到重覆两个的<MATab>
  1. <MATab>
  2. <MATab>
复制代码
就删除掉其中一个,仅保留一个<MATab>
  1. <MATab>
复制代码
第二个问题

判断文本内如过超过两个</tabID>

就全部删除掉,仅保留文本最底部那一个</tabID>

第三个问题
本地目录,合并a.txt內容到b.txt


=========================
例举其中一段

问题1
处理前:

  <MATab>
    <tabID>tbp2</tabID>
    <tabName>尚未</tabName>
  </MATab>
  <MATab>
  <MATab>
   
<tabID>tbp1</tabID>
    <tabName>尚未</tabName>
  </MATab>

处理后:

  <MATab>
    <tabID>tbp2</tabID>
    <tabName>尚未</tabName>
  </MATab>
  <MATab>   
<tabID>tbp1</tabID>
    <tabName>尚未</tabName>
  </MATab>

问题2
处理前:

    <tabID>tbp3</tabID>   
<tabName>尚未</tabName>
  </MATab>
  <MATab>
    <tabID>tbp4</tabID>   
<tabName>尚未</tabName>
  </MATab>
  <MATab>
    <tabID>tbp5</tabID>   
<tabName>尚未</tabName>

处理后:

<tabID>tbp3
    <tabName>尚未</tabName>
  </MATab>
  <MATab>
    <tabID>tbp4
    <tabName>尚未</tabName>
  </MATab>
  <MATab>
    <tabID>tbp5</tabID>    
<tabName>尚未</tabName>

===============================

万分感谢,请求亲爱的众版友帮忙
作者: Hello123World    时间: 2011-5-28 16:03

本帖最后由 Hello123World 于 2011-5-28 16:29 编辑

我来回答第三个:
  1. @echo off
  2. copy /y a.txt+b.txt b.txt
复制代码
忘记加/y 参数了。
作者: leo198444    时间: 2011-5-28 16:12

我来回答第三个:@echo off
copy a.txt+b.txt b.txt
Hello123World 发表于 2011-5-28 16:03

谢谢

批处理貌似对纵列不易处理啊@@
作者: batman    时间: 2011-5-28 16:38

请楼主贴上文本具体样式。。。。
作者: leo198444    时间: 2011-5-28 16:46

本帖最后由 leo198444 于 2011-5-28 16:51 编辑

整个文本很多内容,要全部贴出来吗@@?

例举其中一段

问题1
处理前:

  <MATab>
    <tabID>tbp2</tabID>
    <tabName>尚未</tabName>
  </MATab>
  <MATab>
  <MATab>
   
<tabID>tbp1</tabID>
    <tabName>尚未</tabName>
  </MATab>

处理后:

  <MATab>
    <tabID>tbp2</tabID>
    <tabName>尚未</tabName>
  </MATab>
  <MATab>   
<tabID>tbp1</tabID>
    <tabName>尚未</tabName>
  </MATab>

问题2
处理前:

    <tabID>tbp3</tabID>   
<tabName>尚未</tabName>
  </MATab>
  <MATab>
    <tabID>tbp4</tabID>   
<tabName>尚未</tabName>
  </MATab>
  <MATab>
    <tabID>tbp5</tabID>   
<tabName>尚未</tabName>

处理后:

<tabID>tbp3
    <tabName>尚未</tabName>
  </MATab>
  <MATab>
    <tabID>tbp4
    <tabName>尚未</tabName>
  </MATab>
  <MATab>
    <tabID>tbp5</tabID>    
<tabName>尚未</tabName>

麻烦谢谢
作者: batman    时间: 2011-5-28 16:55

请更新至顶楼。。。。
作者: leo198444    时间: 2011-5-28 16:59

本帖最后由 leo198444 于 2011-5-28 17:00 编辑

麻烦您了~~蝙蝠侠
作者: leo198444    时间: 2011-5-28 17:27

别欺负我啊~~蝙蝠侠大哥

您要我具体样式我也给了

您要我至顶楼我也至了

不会还要我瞌头请托吧

虽然我是孤苦无依的台湾人

但我为了批处理来这热爱祖国啊

还学习祖国的用语来发文


麻烦帮忙~~蝙蝠侠大哥
作者: CrLf    时间: 2011-5-28 17:31

本帖最后由 zm900612 于 2011-5-28 18:57 编辑

问题一是仅删除相邻两行的<MATab>吗?而且这些<MATab>都是独占一行?如果真是如此,那倒不难:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt) do (
  3.    if "%%a"=="<MATab>" (set /a n+=1) else set n=
  4.    if !n! leq 1 echo %%a
  5. )
  6. pause
复制代码
问题二中的关键词如果一行最多只有一个,看上去也不是太难,不知是不是这样:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=:" %%a in ('findstr /n .* 1.txt') do (
  3.    set /a n+=1,h=%%a
  4. )
  5. if %n% geq 3 for /f "tokens=1* delims=:" %%a in ('findstr /n .* 1.txt') do (
  6.    set "tmp=%%b</tabID>"
  7.    if %%a neq %h% (
  8.       echo;!tmp:^</tabID^>=!
  9.    ) else echo;%%b
  10. )
  11. pause
复制代码

作者: leo198444    时间: 2011-5-28 17:44

问题一是仅删除相邻两行的吗?而且这些都是独占一行?如果真是如此,那倒不难:@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (1.txt) do (
   if "%%a"=="" (set /a n+=1) else set n=
   ...
zm900612 发表于 2011-5-28 17:31


谢谢您啊

但是我只是一介新手

您帮我pause出来,我是看的很开心

但是我不懂处理后怎么输出啊
作者: tmplinshi    时间: 2011-5-28 17:58

问题一和问题二是同时处理的吧?
作者: leo198444    时间: 2011-5-28 17:59

问题一和问题二是同时处理的吧?
tmplinshi 发表于 2011-5-28 17:58



是啊是啊

小弟不希望是改天再处理

要一起处理! 谢谢!
作者: CrLf    时间: 2011-5-28 18:19

本帖最后由 zm900612 于 2011-5-28 18:57 编辑

其实把那两个代码各运行一遍不就好了吗...
偷懒一下,简单合并代码,就不精简了
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in (1.txt) do (
  3.    if "%%a"=="<MATab>" (set /a n+=1) else set m=
  4.    if !m! leq 1 echo %%a
  5. ))>tmp
  6. for /f "delims=:" %%a in ('findstr /n .* tmp') do (
  7.    set /a n+=1,h=%%a
  8. )
  9. if %n% geq 3 (
  10.    for /f "tokens=1* delims=:" %%a in ('findstr /n .* tmp') do (
  11.       set "tmp=%%b</tabID>"
  12.       if %%a neq %h% (
  13.          echo;!tmp:^</tabID^>=!
  14.       ) else echo;%%b
  15.    )
  16. )>结果.txt
  17. pause
复制代码

作者: leo198444    时间: 2011-5-28 18:38

其实把那两个代码各运行一遍不就好了吗...
偷懒一下,简单合并代码,就不精简了@echo off&setlocal enabledelayedexpansion
(for /f "delims=" %%a in (1.txt) do (
   if "%%a"=="" (set /a n+=1) else set m=
...
zm900612 发表于 2011-5-28 18:19

谢谢

我执行后只跳出一个黑屏

啥都没改变

@@?

请测我附件
作者: CrLf    时间: 2011-5-28 18:56

本帖最后由 zm900612 于 2011-5-28 18:58 编辑

我代码有一点错,'findstr /n .* tmp'漏了.*。
不过楼主的附件是utf-8格式的啊,恐怕没法直接处理,需要先转格式,否则处理汉字时会不正常。
作者: 随风    时间: 2011-5-28 20:50

第一个问题和第二个问题
只能处理ansi编码文本。
:
  1. @echo off
  2. for /f "delims=:" %%i in ('findstr /ni "</tabID>" a.txt') do set /a h=%%i
  3. ((for /f "delims=" %%i in ('findstr /n .* a.txt') do (
  4.    set "str=%%i"
  5.    for /f "delims=:" %%a in ("%%i") do set /a i=%%a
  6.    setlocal enabledelayedexpansion
  7.    set "str=a!str:*:=!"
  8.    set "num=a!num:*:=!"
  9.    if "!str!"=="a" (echo;) else (
  10.       set var=!str: =!
  11.       if "!var!"=="a" (echo;) else (
  12.          if "!str!"=="a<MATab>" (
  13.             if not "!str!"=="!num!" echo;^<MATab^>
  14.          ) else (
  15.             set str=!str:~1!
  16.             if !h! neq !i! (
  17.                echo !str:^</tabID^>=!
  18.              ) else echo !str!
  19.          )
  20.       )
  21.     )
  22.     endlocal
  23.     set "num=%%i"
  24. ))>tem.txt
  25. start tem.txt
复制代码

作者: batman    时间: 2011-5-28 22:54

第一问:
  1. Dim fso, vbstr, regex
  2. Set fso = CreateObject("scripting.filesystemobject")
  3. vbstr = fso.OpenTextFile("a.txt", 1).ReadAll()
  4. Set regex = New RegExp
  5. regex.Global = True
  6. regex.Pattern = "([.\s]+)<MATab>[\s]+<MATab>([.\s]+)"
  7. vbstr = regex.Replace(vbstr, "$1<MATab>$2")
  8. fso.OpenTextFile("a.txt", 2, 1).Write vbstr
  9. Set fso = Nothing
  10. Set regex = Nothing
  11. MsgBox "ok"
复制代码

作者: tmplinshi    时间: 2011-5-29 10:45

本帖最后由 tmplinshi 于 2011-5-29 11:03 编辑
  1. @echo off
  2. rem 在这里设置要修改的文件
  3. set file="a.txt"
  4. set temp_file="%temp%\.tmp.%random%"
  5. set /a tag_num = 0, dup_line = 0
  6. rem 查找“</tabID>”的个数
  7. find /c /i "</tabID>" <%file% >%temp_file%
  8. set /p tag_num=<%temp_file%
  9. if %tag_num% gtr 2 set /a tag_num += 1
  10. rem 为了保留空行
  11. findstr /n .* %file% >%temp_file%
  12. (for /f "usebackq delims=" %%a in (%temp_file%) do (
  13.     set str=%%a
  14.     SetLocal EnableDelayedExpansion
  15.     set str= !str:*:=!
  16.     if /i "!str: =!" == "<MATab>" (
  17.         set /a dup_line += 1
  18.     ) else (
  19.         set dup_line=0
  20.         if !tag_num! gtr 2 (
  21.             if /i "!str:</tabID>=!" neq "!str!" (
  22.                 set "str=!str:</tabID>=!"
  23.                 set /a tag_num -= 1
  24.             )
  25.         )
  26.     )
  27.     if !dup_line! leq 1 echo,!str:~1!
  28.     for /f "tokens=1,2" %%a in ("!tag_num! !dup_line!") do (
  29.         EndLocal
  30.         set tag_num=%%a
  31.         set dup_line=%%b
  32.     )
  33. )) >%file%
  34. del %temp_file%
复制代码

作者: batman    时间: 2011-5-29 17:59

本帖最后由 batman 于 2011-5-29 18:33 编辑

第二问:
  1. Dim fso, vbstr, vbout
  2. Set fso = CreateObject("scripting.filesystemobject")
  3. vbstr = fso.OpenTextFile("a.txt", 1).ReadAll()
  4. Dim str, stra
  5. If UBound(Split(vbstr, "</tabID>")) < 3 Then stra = "</tabID>"
  6. For i = 0 To UBound(Split(vbstr, "</tabID>"))
  7.   If i = UBound(Split(vbstr, "</tabID>")) - 1 Then
  8.     vbout = vbout & Split(vbstr, "</tabID>")(i) & "</tabID>"
  9.     Else
  10.     vbout = vbout & Split(vbstr, "</tabID>")(i) & stra
  11.   End If
  12. Next
  13. fso.OpenTextFile("a.txt", 2, 1).Write vbout
  14. Set fso = Nothing
  15. MsgBox "ok"
复制代码
ps:昨天是老妈生日,所以没能及时回复。。。
作者: leo198444    时间: 2011-5-30 02:11

抱歉来晚了

bat似乎对utf8文本完全不起作用

我试过超级版主的vbs

但是只能在本地编码作用,vbs改成utf8编码就完全不能执行

请问该怎么办谢谢
作者: batman    时间: 2011-5-30 08:23

不能简单地改文件格式啊,要用转码工具转码
作者: leo198444    时间: 2011-5-30 14:16

所以批处理碰上编码是无解@@
作者: tmplinshi    时间: 2011-5-30 18:34

本帖最后由 tmplinshi 于 2011-5-31 08:32 编辑

代码中用到了编码转换工具 iconv。iconv 下载地址:
http://bathome.net/thread-10861-1-2.html
  1. @echo off
  2. rem 在这里设置要修改的文件
  3. set file="4.htm"
  4. set temp_file="%temp%\.tmp.%random%"
  5. set /a tag_num = 0, dup_line = 0
  6. rem 查找“</tabID>”的个数
  7. find /c /i "</tabID>" <%file% >%temp_file%
  8. set /p tag_num=<%temp_file%
  9. if %tag_num% gtr 2 set /a tag_num += 1
  10. iconv -f utf-8 -t gbk -c %file% | findstr /n .* >%temp_file%
  11. (for /f "usebackq delims=" %%a in (%temp_file%) do (
  12.     set str=%%a
  13.     SetLocal EnableDelayedExpansion
  14.     set str= !str:*:=!
  15.     if /i "!str: =!" == "<MATab>" (
  16.         set /a dup_line += 1
  17.     ) else (
  18.         set dup_line=0
  19.         if !tag_num! gtr 2 (
  20.             if /i "!str:</tabID>=!" neq "!str!" (
  21.                 set "str=!str:</tabID>=!"
  22.                 set /a tag_num -= 1
  23.             )
  24.         )
  25.     )
  26.     if !dup_line! leq 1 echo,!str:~1!
  27.     for /f "tokens=1,2" %%a in ("!tag_num! !dup_line!") do (
  28.         EndLocal
  29.         set tag_num=%%a
  30.         set dup_line=%%b
  31.     )
  32. )) >%file%
  33. iconv -f gbk -t utf-8 %file% >%temp_file%
  34. move %temp_file% %file%
复制代码

作者: leo198444    时间: 2011-5-31 08:00

不好意思

我再上传一次文本

给大哥们测试看看

我的文本一定要是utf8才能在软件上运行

一但不是utf8就不能使用

可是批处理无法对utf8作处理@@
作者: tmplinshi    时间: 2011-5-31 08:27

24# leo198444


测试了 23 楼的代码吗?
作者: leo198444    时间: 2011-6-1 04:48

24# leo198444


测试了 23 楼的代码吗?
tmplinshi 发表于 2011-5-31 08:27


你好,谢谢你

我已经试过了

但是毫无作用




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