本帖最后由 mxxcgzxxx 于 2011-8-2 23:23 编辑
在CrLf 的《批处理利用set /p与重定向输入分行获取文本内容》一文中我对SET/P与PAUSE结合而读取到的0A换行符非常的有兴趣,因此通过测试0A字符的功能与特点,希望能让这个特别的字符派上用场!
首先是这个字符与其他换行符不同之处在于:
1.它不是一个完整的换行符,因此有很大区别,它是存在的,可以看得到的!
2.它在大多数情况下与换行符功能相当,可以获取,可以替换,可以写入函数.但它还能写入文本,却不是以换行形式存在!
3.一般情况下换行符就等同于拆分文本,但0A字符不是,显示时虽然也是分行的,但实际只存在一行文本数据,一个数据的容量也受最大存储量的限制,0A换行符占一个字符位。
4.多数情况下文本中的0A字符都起到换行作用,使用type\FOR\findstr读时都只能以行截取方式读它前后的文本.但在SET/P情况下可以完整的读取到它并保持行的完整性!
由于论坛也不支持显示0A字符,所以只能通过运行程序在文本中体现了,下面就是我的测试程序.
优点:
1、独一无二的分隔符,适合分段式存取数据或数据组中需要应用各种特殊符号的情况,对于数组中字符未知、列数不等的情况尤为好用。
2、可以在TXT格式文本中进行复制粘贴,同样适用于BAT(VBS,JV等未测试)。
(但在写入BAT时要注意0A换行符无法直接用在代码中,可以将值放在代码头部,用(set/p p=)<%0方法读取),具体方法看14楼,感谢lfoqtal的提示
3、在显示数据时用时比普通换行符更少。
缺点:
1、适用文本少,大多数文本格式不支持0A的独立存在,所以应用局限性强
2、现发现只能使用SET/P方式还原,无法使用其他语句进行读取
3、无法使用SET替换回正常符号
大家可以看看生成的文本与显示之间的区别,在1.txt文本中显示的黑块就是0A换行符-
- :
- @echo off
- setlocal enabledelayedexpansion
- set "e=^!a^!"
- ::0A 换行符的获取
- (pause&set/p a=)<%0 >nul
- set a=!a::=!
- ECHO 0A 的显示
- echo 1-0A!a!0A
- echo 2-0A%a%0A
- echo 3-0A%e%0A
- pause
- ECHO 将0A 换行符单独保存入一个文本中
- echo.!a!>1.txt
- ECHO 0A字符在函数中的转嫁
- set b=123!a!456
- set b=!b!!a!999
- echo B=!b!
- set c=aaa#bbb#ccc
- set c=%c:#=!a!%
- echo C=!c!
- ECHO 将带有0A字符的值写入文本
- echo B=!b!>>1.txt
- echo C=!c!>>1.txt
- pause
- ECHO 利用0A字符的换行功能,在FOR中进行文本读取
- for /f %%a in ("!b!") do echo B= %%a
- for %%a in (!c!) do echo C= %%a
- pause
- ECHO type命令查看带有0A字符文本的情况
- type 1.txt
- pause
- ECHO for /f 命令读取带有0A字符文本的情况
- for /f "delims=" %%a in (1.txt) do echo %%a
- pause
- ECHO findstr 判断0A文本的能力
- findstr "456" 1.txt
- pause
- ECHO 用set/p方式读取文本,由于第一行的0A 与第一句换行符的0D0A相配,使第二个0A下沉到第二句句首
- (for /l %%a in (1 1 3) do set/p d0A%%a=)<1.txt
- set d0A
- pause
- ECHO 替换0A换行符为普通字符,总是失败
- set b=%b:!a!=QQ%
- set c=!c:%e%=666!
- echo B=!b!
- echo C=!c!
- pause
复制代码 利用0A分段式保存数据-
- :
- @echo off
- setlocal enabledelayedexpansion
- cd.>2.txt
- (pause&set/p a=)<%0 >nul
- set a=!a::=!
- for /l %%i in (1 1 3) do (
- set/a b=%%i+1
- for /l %%a in (1 1 !b!) do (
- set/p 数据%%i%%a=%%i组%%a列,请输入任意文本:
- set 数组%%i=!数组%%i!!a!!数据%%i%%a!
- )
- echo !数组%%i!>>2.txt
- )
- cls
- echo 显示文本
- type 2.txt
- pause
- cls
- ::读取文本
- (for /l %%i in (1 1 3) do set/p 文组%%i=)<2.txt
- ::比对一
- echo 组对比
- set 数组
- set 文组
- pause
复制代码 希望大家也一起来测试它的能力,看看在哪些方面能巧妙的利用上 |