Board logo

标题: [文本处理] 批处理提取文本指定位置的内容 [打印本页]

作者: 随风    时间: 2007-12-17 00:18     标题: 批处理提取文本指定位置的内容

无聊,出一题大家作作,在百度看到的
a.txt内容
111     222 333    777   444        555 666        777   
11 222 333  444         777     555 666          777   
1as1 222 333 444  555
111 222 333     444 555    666           777
111 222     333     444     555 666        777      
111 222     333          444 555 666     777         888      

要求:显示效果如下,以前三行为例.(即:把最后一列排在最前,第一列抛弃,)
     实际文本内容不光只是数字,而是字母数字混合,所以不能以数字来作判断
  a.txt中每行的中间及行尾的空格数量是不确定的.
777 222 333    777   444        555 666
777 222 333  444         777     555 666
555 222 333 444

[ 本帖最后由 随风 于 2007-12-17 21:02 编辑 ]
作者: ieutk    时间: 2007-12-17 12:42

我看不懂那要求是什么意思
作者: 随风    时间: 2007-12-17 16:16

这样懂了么?
作者: youxi01    时间: 2007-12-17 19:56

给一段 效率 非常低的代码:
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (1.txt) do call :Get_Res "%%i"
  3. pause>nul
  4. Rem '/*去掉右侧的空格;
  5. :Rtrim
  6. set var=%*
  7. goto :eof
  8. Rem '/*==============================
  9. Rem '/*去掉首字符,交换尾字符串位置
  10. :Get_Res obj
  11. Rem '/*去掉首字符串
  12. set var=%~1
  13. set var=%var:* =%
  14. Rem '/*==============================
  15. call :Rtrim %var%
  16. set str=%var: =# % %======将空格替换为 #+空格 的形式===========%
  17. set "cx="
  18. for %%i in (%str%) do (
  19.      set str_=%%i %======取得最后一串字符===========%
  20.      call set cx=%%i!cx!)  %======将字符串倒序=========%
  21. set cx=%cx:#= #%         %======将#替换为 空格+# 的形式===========%
  22. set cx=%cx:* =%          %======去掉第一串字符====================%
  23. set "res="
  24. for %%i in (%cx%) do set "res=%%i!res!"    %======将字符串倒序=========%
  25. set "res=%res:#= %"                      %======将 # 替换回 空格=====%
  26. echo %str_%%res%
复制代码

作者: foxJL    时间: 2007-12-17 22:47

  1. @echo off&setlocal enabledelayedexpansion
  2. ::右边最多只能有20个空格
  3. for /f "tokens=1,*" %%i in (a.txt) do (
  4. set num=0
  5. set blank=
  6. set a=%%j
  7. for %%z in (%%j) do (set fin=%%z)
  8. for /l %%x in (1,1,20) do (
  9. set blank= !blank!
  10. if "!a:~-%%x!"=="!blank!" set /a num+=1
  11. )
  12. call set b=%%a:~0,-!num!%%#
  13. call set fina=%%b:!fin!#=%%
  14. echo !fin! !fina!
  15. )
  16. pause
复制代码

作者: youxi01    时间: 2007-12-18 00:02

借鉴了 foxjl 的代码,尽量精简了代码;
函数版:
  1. @echo off
  2. ::注意,代码中不能含有字符:*
  3. for /f "tokens=1,* delims=" %%i in (a.txt) do call :Get_Res "%%i"
  4. pause>nul
  5. :Get_Res obj
  6. set "var=%~1"
  7. call :Rtrim %var%
  8. for %%i in (%var%) do "set str=%%i"
  9. call set "var=%%var:%str%=%%"
  10. echo %str:~0,-1% %var%
  11. goto :eof
  12. Rem '/*去掉右侧的空格;
  13. :Rtrim
  14. set var=%*#
复制代码

作者: youxi01    时间: 2007-12-18 00:06

非函数最简版:
  1. @echo off & setlocal enabledelayedexpansion
  2. ::注意,代码中不能含有字符:*和其它特殊字符
  3. for /f "tokens=1,* delims=" %%i in (a.txt) do (
  4.     call :Rtrim %%i
  5.     for %%j in (!var!) do set str=%%j
  6.     call set var=%%var:!str!=%%
  7.     echo !str:~0,-1! !var!)
  8. pause>nul
  9. :Rtrim
  10. set var=%*#
复制代码

作者: 随风    时间: 2007-12-18 11:11

替换掉最后的字符是不行的,最后的字符不是唯一的
作者: youxi01    时间: 2007-12-18 11:29

最后的字符虽然不是唯一的,但是我给它加上了一个特殊 标记: * 啊
不过 不能有一种很特殊的情况....
作者: 随风    时间: 2007-12-18 11:58

帖一段我的
  1. @echo off
  2. for /f "tokens=1* delims= " %%i in (a.txt) do (
  3. setlocal enabledelayedexpansion
  4. for %%a in (%%j) do set "size=%%a"
  5. call :lis %%j
  6. echo  !size! !name!
  7. endlocal
  8. )
  9. pause&exit
  10. :lis
  11. set "name=%*"
  12. if defined ok goto :eof
  13. if "%name:~-2,1%"==" " set ok=a
  14. call :lis %name:~0,-1%
  15. goto :eof
复制代码

作者: lvsehuaxue    时间: 2012-5-12 18:39

本帖最后由 lvsehuaxue 于 2012-5-12 18:47 编辑

连中间的空格数都不变
  1. @echo off
  2. for /f "tokens=1 delims=" %%i in (a.txt) do (
  3.    setlocal enabledelayedexpansion
  4.    set "var=%%~nxi"
  5.    for %%i in (%%i) do (
  6.        set /a n+=1
  7.        if !n! equ 1 set "str1=%%i"
  8.        set "str2=%%i"
  9.    )
  10.    set "var=!var!$$"
  11.    call set "var=%%var:*!str1!=!str2!%%"
  12.    call echo %%var:!str2!$$=%%
  13.    endlocal
  14. )  
  15. pause
复制代码





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