标题: [文本处理] 批处理提取文本指定位置的内容 [打印本页]
作者: 随风 时间: 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
给一段 效率 非常低的代码:- @echo off & setlocal enabledelayedexpansion
- for /f "delims=" %%i in (1.txt) do call :Get_Res "%%i"
- pause>nul
-
- Rem '/*去掉右侧的空格;
- :Rtrim
- set var=%*
- goto :eof
-
- Rem '/*==============================
- Rem '/*去掉首字符,交换尾字符串位置
- :Get_Res obj
- Rem '/*去掉首字符串
- set var=%~1
- set var=%var:* =%
- Rem '/*==============================
-
- call :Rtrim %var%
- set str=%var: =# % %======将空格替换为 #+空格 的形式===========%
- set "cx="
- for %%i in (%str%) do (
- set str_=%%i %======取得最后一串字符===========%
- call set cx=%%i!cx!) %======将字符串倒序=========%
- set cx=%cx:#= #% %======将#替换为 空格+# 的形式===========%
- set cx=%cx:* =% %======去掉第一串字符====================%
- set "res="
-
- for %%i in (%cx%) do set "res=%%i!res!" %======将字符串倒序=========%
- set "res=%res:#= %" %======将 # 替换回 空格=====%
- echo %str_%%res%
复制代码
作者: foxJL 时间: 2007-12-17 22:47
- @echo off&setlocal enabledelayedexpansion
- ::右边最多只能有20个空格
- for /f "tokens=1,*" %%i in (a.txt) do (
- set num=0
- set blank=
- set a=%%j
- for %%z in (%%j) do (set fin=%%z)
- for /l %%x in (1,1,20) do (
- set blank= !blank!
- if "!a:~-%%x!"=="!blank!" set /a num+=1
- )
- call set b=%%a:~0,-!num!%%#
- call set fina=%%b:!fin!#=%%
- echo !fin! !fina!
- )
- pause
复制代码
作者: youxi01 时间: 2007-12-18 00:02
借鉴了 foxjl 的代码,尽量精简了代码;
函数版:
- @echo off
- ::注意,代码中不能含有字符:*
- for /f "tokens=1,* delims=" %%i in (a.txt) do call :Get_Res "%%i"
- pause>nul
-
- :Get_Res obj
- set "var=%~1"
- call :Rtrim %var%
- for %%i in (%var%) do "set str=%%i"
- call set "var=%%var:%str%=%%"
- echo %str:~0,-1% %var%
- goto :eof
-
- Rem '/*去掉右侧的空格;
- :Rtrim
- set var=%*#
复制代码
作者: youxi01 时间: 2007-12-18 00:06
非函数最简版:- @echo off & setlocal enabledelayedexpansion
- ::注意,代码中不能含有字符:*和其它特殊字符
- for /f "tokens=1,* delims=" %%i in (a.txt) do (
- call :Rtrim %%i
- for %%j in (!var!) do set str=%%j
- call set var=%%var:!str!=%%
- echo !str:~0,-1! !var!)
- pause>nul
-
- :Rtrim
- set var=%*#
复制代码
作者: 随风 时间: 2007-12-18 11:11
替换掉最后的字符是不行的,最后的字符不是唯一的
作者: youxi01 时间: 2007-12-18 11:29
最后的字符虽然不是唯一的,但是我给它加上了一个特殊 标记: * 啊
不过 不能有一种很特殊的情况....
作者: 随风 时间: 2007-12-18 11:58
帖一段我的- @echo off
- for /f "tokens=1* delims= " %%i in (a.txt) do (
- setlocal enabledelayedexpansion
- for %%a in (%%j) do set "size=%%a"
- call :lis %%j
- echo !size! !name!
- endlocal
- )
- pause&exit
- :lis
- set "name=%*"
- if defined ok goto :eof
- if "%name:~-2,1%"==" " set ok=a
- call :lis %name:~0,-1%
- goto :eof
复制代码
作者: lvsehuaxue 时间: 2012-5-12 18:39
本帖最后由 lvsehuaxue 于 2012-5-12 18:47 编辑
连中间的空格数都不变- @echo off
- for /f "tokens=1 delims=" %%i in (a.txt) do (
- setlocal enabledelayedexpansion
- set "var=%%~nxi"
- for %%i in (%%i) do (
- set /a n+=1
- if !n! equ 1 set "str1=%%i"
- set "str2=%%i"
- )
- set "var=!var!$$"
- call set "var=%%var:*!str1!=!str2!%%"
- call echo %%var:!str2!$$=%%
- endlocal
- )
- pause
复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |