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

[文本处理] 批处理提取文本指定位置的内容

无聊,出一题大家作作,在百度看到的
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 编辑 ]
技术问题请到论坛发帖求助!

我看不懂那要求是什么意思
不大可能的事也许今天实现,根本不可能的事也许明天会实现

TOP

这样懂了么?
技术问题请到论坛发帖求助!

TOP

给一段 效率 非常低的代码:
  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%
复制代码

TOP

  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
复制代码
1

评分人数

TOP

借鉴了 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=%*#
复制代码

TOP

非函数最简版:
  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=%*#
复制代码

TOP

替换掉最后的字符是不行的,最后的字符不是唯一的
技术问题请到论坛发帖求助!

TOP

最后的字符虽然不是唯一的,但是我给它加上了一个特殊 标记: * 啊
不过 不能有一种很特殊的情况....

TOP

帖一段我的
  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
复制代码
1

评分人数

技术问题请到论坛发帖求助!

TOP

本帖最后由 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
复制代码

TOP

返回列表