标题: [文本处理] 批处理怎样删除文字纵列重复的行? [打印本页]
作者: leo198444 时间: 2011-5-28 06:25 标题: 批处理怎样删除文字纵列重复的行?
请教我有一文本内有纵列的行要判断处理
第一个问题
找到重覆两个的<MATab>复制代码
就删除掉其中一个,仅保留一个<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 编辑
我来回答第三个:- @echo off
- 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>都是独占一行?如果真是如此,那倒不难:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (1.txt) do (
- if "%%a"=="<MATab>" (set /a n+=1) else set n=
- if !n! leq 1 echo %%a
- )
- pause
复制代码
问题二中的关键词如果一行最多只有一个,看上去也不是太难,不知是不是这样:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=:" %%a in ('findstr /n .* 1.txt') do (
- set /a n+=1,h=%%a
- )
- if %n% geq 3 for /f "tokens=1* delims=:" %%a in ('findstr /n .* 1.txt') do (
- set "tmp=%%b</tabID>"
- if %%a neq %h% (
- echo;!tmp:^</tabID^>=!
- ) else echo;%%b
- )
- 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 编辑
其实把那两个代码各运行一遍不就好了吗...
偷懒一下,简单合并代码,就不精简了- @echo off&setlocal enabledelayedexpansion
- (for /f "delims=" %%a in (1.txt) do (
- if "%%a"=="<MATab>" (set /a n+=1) else set m=
- if !m! leq 1 echo %%a
- ))>tmp
- for /f "delims=:" %%a in ('findstr /n .* tmp') do (
- set /a n+=1,h=%%a
- )
- if %n% geq 3 (
- for /f "tokens=1* delims=:" %%a in ('findstr /n .* tmp') do (
- set "tmp=%%b</tabID>"
- if %%a neq %h% (
- echo;!tmp:^</tabID^>=!
- ) else echo;%%b
- )
- )>结果.txt
- 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编码文本。
:- @echo off
- for /f "delims=:" %%i in ('findstr /ni "</tabID>" a.txt') do set /a h=%%i
- ((for /f "delims=" %%i in ('findstr /n .* a.txt') do (
- set "str=%%i"
- for /f "delims=:" %%a in ("%%i") do set /a i=%%a
- setlocal enabledelayedexpansion
- set "str=a!str:*:=!"
- set "num=a!num:*:=!"
- if "!str!"=="a" (echo;) else (
- set var=!str: =!
- if "!var!"=="a" (echo;) else (
- if "!str!"=="a<MATab>" (
- if not "!str!"=="!num!" echo;^<MATab^>
- ) else (
- set str=!str:~1!
- if !h! neq !i! (
- echo !str:^</tabID^>=!
- ) else echo !str!
- )
- )
- )
- endlocal
- set "num=%%i"
- ))>tem.txt
- start tem.txt
复制代码
作者: batman 时间: 2011-5-28 22:54
第一问:- Dim fso, vbstr, regex
- Set fso = CreateObject("scripting.filesystemobject")
- vbstr = fso.OpenTextFile("a.txt", 1).ReadAll()
- Set regex = New RegExp
- regex.Global = True
- regex.Pattern = "([.\s]+)<MATab>[\s]+<MATab>([.\s]+)"
- vbstr = regex.Replace(vbstr, "$1<MATab>$2")
- fso.OpenTextFile("a.txt", 2, 1).Write vbstr
- Set fso = Nothing
- Set regex = Nothing
- MsgBox "ok"
复制代码
作者: tmplinshi 时间: 2011-5-29 10:45
本帖最后由 tmplinshi 于 2011-5-29 11:03 编辑
- @echo off
-
- rem 在这里设置要修改的文件
- set file="a.txt"
-
- set temp_file="%temp%\.tmp.%random%"
- set /a tag_num = 0, dup_line = 0
-
- rem 查找“</tabID>”的个数
- find /c /i "</tabID>" <%file% >%temp_file%
- set /p tag_num=<%temp_file%
- if %tag_num% gtr 2 set /a tag_num += 1
-
- rem 为了保留空行
- findstr /n .* %file% >%temp_file%
-
- (for /f "usebackq delims=" %%a in (%temp_file%) do (
- set str=%%a
- SetLocal EnableDelayedExpansion
- set str= !str:*:=!
- if /i "!str: =!" == "<MATab>" (
- set /a dup_line += 1
- ) else (
- set dup_line=0
- if !tag_num! gtr 2 (
- if /i "!str:</tabID>=!" neq "!str!" (
- set "str=!str:</tabID>=!"
- set /a tag_num -= 1
- )
- )
- )
- if !dup_line! leq 1 echo,!str:~1!
- for /f "tokens=1,2" %%a in ("!tag_num! !dup_line!") do (
- EndLocal
- set tag_num=%%a
- set dup_line=%%b
- )
- )) >%file%
-
- del %temp_file%
复制代码
作者: batman 时间: 2011-5-29 17:59
本帖最后由 batman 于 2011-5-29 18:33 编辑
第二问:- Dim fso, vbstr, vbout
- Set fso = CreateObject("scripting.filesystemobject")
- vbstr = fso.OpenTextFile("a.txt", 1).ReadAll()
- Dim str, stra
- If UBound(Split(vbstr, "</tabID>")) < 3 Then stra = "</tabID>"
- For i = 0 To UBound(Split(vbstr, "</tabID>"))
- If i = UBound(Split(vbstr, "</tabID>")) - 1 Then
- vbout = vbout & Split(vbstr, "</tabID>")(i) & "</tabID>"
- Else
- vbout = vbout & Split(vbstr, "</tabID>")(i) & stra
- End If
- Next
- fso.OpenTextFile("a.txt", 2, 1).Write vbout
- Set fso = Nothing
- 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- @echo off
-
- rem 在这里设置要修改的文件
- set file="4.htm"
-
- set temp_file="%temp%\.tmp.%random%"
- set /a tag_num = 0, dup_line = 0
-
- rem 查找“</tabID>”的个数
- find /c /i "</tabID>" <%file% >%temp_file%
- set /p tag_num=<%temp_file%
- if %tag_num% gtr 2 set /a tag_num += 1
-
- iconv -f utf-8 -t gbk -c %file% | findstr /n .* >%temp_file%
-
- (for /f "usebackq delims=" %%a in (%temp_file%) do (
- set str=%%a
- SetLocal EnableDelayedExpansion
- set str= !str:*:=!
- if /i "!str: =!" == "<MATab>" (
- set /a dup_line += 1
- ) else (
- set dup_line=0
- if !tag_num! gtr 2 (
- if /i "!str:</tabID>=!" neq "!str!" (
- set "str=!str:</tabID>=!"
- set /a tag_num -= 1
- )
- )
- )
- if !dup_line! leq 1 echo,!str:~1!
- for /f "tokens=1,2" %%a in ("!tag_num! !dup_line!") do (
- EndLocal
- set tag_num=%%a
- set dup_line=%%b
- )
- )) >%file%
-
- iconv -f gbk -t utf-8 %file% >%temp_file%
- 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 |