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

[文本处理] 批处理去除文本中所有的汉字

  因昨天群里有位朋友问到这个问题,在帮他解决后感觉大家平常应该会经常遇到这样的问题,所以将我的两段代码给出,大家也可以跟帖给出自己的方法:
1、批处理方法,个人认为还是逐字符保险一些,只是遇到大文本效率会有问题(另外大家想一想为什么代码中的变量延迟要如此处理):
  1. @echo off
  2. cd.>b.txt
  3. for /f "delims=" %%a in (a.txt) do (
  4.   set "str=%%a"
  5.   setlocal enabledelayedexpansion
  6.   call :lp
  7.   endlocal
  8. )
  9. echo ok
  10. pause>nul&goto :eof
  11. :lp
  12. if /i "!str:~,1!" leq "z" set "var=!var!!str:~,1!"
  13. set "str=!str:~1!"
  14. if defined str goto lp
  15. >>b.txt echo.!var!&set "var="
复制代码
2、vbs方法,顺便说一下查了一下unicode编码表居然\u4e00就是“一”
  1. Dim FSO, vbStr
  2. Set FSO = CreateObject("Scripting.FileSystemObject")
  3. vbStr = FSO.OpenTextFile("a.txt").ReadAll()
  4. FSO.OpenTextFile("b.txt", 2, True).Write RegEx(vbStr)
  5. MsgBox "ok"
  6. Set FSO = Nothing
  7. Function RegEx(Str)
  8.   Set RegEx = New RegExp
  9.   RegEx.IgnoreCase = True
  10.   RegEx.Global = True
  11.   RegEx.Pattern = "[\u4e00-\u9fa5]*([^\u4e00-\u9fa5]*)[\u4e00-\u9fa5]*"
  12.   RegEx = RegEx.Replace(str, "$1")
  13. End Function
复制代码
***共同提高***

早中晚各问自己一遍:你平均每周帮助别人解决几个问题?

TOP

本帖最后由 cjiabing 于 2012-4-3 12:50 编辑

回复 14# xss


    比较下:
  1. @echo off
  2. for /f "tokens=*" %%a in ("it show : i love you !") do (
  3.     set "str=%%a"
  4.     setlocal enabledelayedexpansion
  5.     echo;!str!
  6.     endlocal
  7. )
  8. pause
  9. ::可以对叹号等符号支持。
复制代码

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=*" %%a in ("it show : "i love you !"") do (
  3.     set "str=%%a"
  4.     echo;!str!
  5. )
  6. pause
  7. ::叹号!会自动消失
复制代码
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

强烈要求楼主解释一下,为什么变量延迟要这样用,这样用的目的是什么,有什么特殊作用?我菜鸟,实在弄不明白。拜托楼主或其它高手给详细讲解一下,不胜感激!

TOP

本帖最后由 apang 于 2012-3-28 15:31 编辑

去除文档中的英文字母
  1. @echo off
  2. for /f "delims=" %%a in (a.txt) do (
  3.    set "str=%%a"
  4.    setlocal enabledelayedexpansion
  5.    for %%b in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do (
  6.       if defined str set "str=!str:%%b=!"
  7.    )
  8.    echo,!str!
  9.    endlocal
  10. )
  11. pause
复制代码
1

评分人数

    • batman: 变量延迟处理得正确PB + 5

TOP

回复 11# batman


    说实在的写上面的那段代码的时候只看问题,没有看版主的代码和提问啊。
    粗心的俺再次犯错了,今天上午仔细回味了下。看看挽救不?

如果不考虑特殊字符,可以这样用。
这次绝对是看了楼主的代码,总结了自己的错误啊。
  1. @Echo Off
  2. For /F %%A In (Log.txt) Do (
  3.         Echo 原字符:        %%A
  4.         Call :_On %%A
  5. )
  6. Pause>Nul&Exit
  7. :_On
  8. Set "Con=%1"
  9. :_On_Two
  10. If /i "%Con:~,1%" Leq "Z" Set "Var=%Var%%Con:~,1%"
  11. Set "Con=%Con:~1%"
  12. If Not Defined Con Echo 编译后:        %Var%&Set "Var="&Goto :Eof
  13. Goto _On_Two
复制代码
这个是处理特殊字符,跟楼主的方法一样,只是想表明俺看了,俺理解了。
  1. @Echo Off
  2. For /F %%A In (Log.txt) Do (
  3.         Echo 原字符:        %%A
  4. Set "Con=%%A"
  5. SetLocal EnableDelayedExpansion
  6.         Call :_On
  7. Endlocal
  8. )
  9. Pause>Nul&Exit
  10. :_On
  11. If /i "!Con:~,1!" Leq "Z" Set "Var=!Var!!Con:~,1!"
  12. Set "Con=!Con:~1!"
  13. If Not Defined Con Echo 编译后:        !Var!&Set "Var="&Goto :Eof
  14. Goto _On
复制代码
其实没有深彻的去理解这个原因问题,只是我了解如果在开启《变量延迟》的情况给一个变量赋值的话,某些特殊字符会被屏蔽掉例如:!^
楼主的方法应该是在没有开始《变量延迟》的情况给变量赋值,然后打开《变量延迟》是为了在For里可以使用或者说是读取到这个变量。
下面有个小例子
  1. @Echo Off
  2. Set "Var=N你H好~!@#$%^&*()a"
  3. Echo %Var%
  4. SetLocal EnableDelayedExpansion
  5. Set "Var=N你H好~!@#$%^&*()a"
  6. Echo !Var!
  7. Pause>Nul
复制代码
希望能挽救昨天所犯下的错误啊。
1

评分人数

TOP

回复 9# 冷玉公子
兄弟测试了我一楼的代码不?
还有我在括号中写上要你们思考为什么变量延迟处理要如此处理的问题,你真正思考了?
***共同提高***

TOP

  1. cmd /u/q/c (for /f "delims=" %%a in (a.txt)do echo ;%%a)|more|findstr /vbc:"[^ -Z]" ";"
复制代码
玩一下,findstr 的思路,手机码字未验证

TOP

本帖最后由 冷玉公子 于 2012-3-27 23:06 编辑
  1. @Echo Off&SetLocal EnableDelayedExpansion
  2. For /F %%A In (Log.txt) Do (
  3. Set "Value=0"
  4. Echo 原字符: %%A
  5. Call :_On %%A
  6. Echo 编译后: !Var!
  7. Set "Var="
  8. )
  9. Pause>Nul
  10. Exit
  11. :_On
  12. Set "Con=%1"
  13. Set "Var_%Value%=!Con:~%Value%,1!
  14. If /i "!Var_%Value%!" Leq "Z" Set "Var=!Var!!Var_%Value%!"
  15. If Not Defined Var_%Value% Goto :Eof
  16. Set /A "Value+=1"
  17. Goto _On
复制代码
有个问题就是逐字读取,碰到特殊字符就不行了。
例如:!@#$%^&*()

TOP

版主V5
早中晚各问自己一遍:你平均每周帮助别人解决几个问题?

TOP

基本上只能逐字判断了...

TOP

先给给汉字一个确切的定义。。。http://baike.baidu.com/view/25421.htm
思路hex.cmd+ascmap.cmd

TOP

回复 3# cjiabing
如果是汉字和代码混杂的行findstr如何能做到?
***共同提高***

TOP

简单点用findstr,不过其他特殊符号要考虑
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

同时,大家可以想一想如何去除文本中所有的英文字母(这个比较容易些)。。。
***共同提高***

TOP

返回列表