&&将代码再次提效,仍适用于每行字符数不确实的情况(最大字符数可达8190),同时更适用于超大文本(行数很多)的情况。
代码思路:
1、利用折半法获得每行字符数(具体可在论坛搜索折半法),并将最大字符数减1求得截取字符时的最大偏移量(具体可在
论坛搜索截取字符)。
2、对b.txt逐行逐字进行字符截取,并在截取时进行是否是"*"字符的判断,并将"*"字符段设置为丢弃段,其他字符段设置为替换
段(注意是段),并得出总分段数和每段的字符开始时的偏移量和总长度,即:丢弃段(偏移量1,长度1) 替换段(偏移量2,长
度2) ...这样交替n个段次。
3、依次读取a.txt的每行并按b.txt的分段数据进行输出:a.txt保留段(偏移量1,长度1) b.txt替换段(偏移量2,长度2) ...同样
是交替的n个段次。
4、为提高代码效率,代码中没有使用一个call,花费了大量的处理代码来完成本要用call来完成的工作,如用for /f "tokens=1,2 deli
ms=-" %%a in ("_!m!_1-_!m!_2") do set "_!m!=!k!-!%%a!-!%%b!"这样复杂的代码来代替call,set "_!m!=!k!-%%_!m!_1%%-%%
_!m!_2"。- @echo off&setlocal enabledelayedexpansion
-
- ::::::折半法获得字符长度::::::
- set /p str=<b.txt&set /a min=0,max=8190
- for /l %%a in (1,1,14) do (
- set /a "num=(min+max)/2"
- for %%b in (!num!) do (
- if "!str:~%%b!" equ "" (
- set /a max=num
- ) else (
- set /a min=num
- )
- )
- )
- if %min% equ %max% set /a num-=1&rem字符长度减1
- ::::::折半法获得字符长度::::::
-
- ::::::替换大循环::::::
- for /f "delims=" %%a in (b.txt) do (
- set "str=%%a"&set /a n=-1,m=0,nums+=1
- cd.>b!nums!.txt
- for /l %%a in (0,1,%num%) do (
- if %%a equ 0 (
- if "!str:~,1!" equ "*" (
- set "flag="
- ) else (
- set "flag=a"
- )
- )
- if "!str:~%%a,1!" equ "*" (
- if not defined flag set /a m+=1&set /a _!m!_1=%%a&set "flag=a"&set "k=var"
- ) else (
- if defined flag set /a m+=1&set /a _!m!_1=%%a&set "flag="&set "k=str"
- )
- set /a _!m!_2+=1
- for /f "tokens=1,2 delims=-" %%a in ("_!m!_1-_!m!_2") do set "_!m!=!k!-!%%a!-!%%b!"
- )
- for /f "delims=" %%a in (a.txt) do (
- set "var=%%a"&set "output="
- for /l %%a in (1,1,!m!) do (
- for /f "tokens=1-3 delims=-" %%a in ("!_%%a!") do set "code=!%%a!"&set "output=!output!!code:~%%b,%%c!"<nul
- )
- echo !output!>>b!nums!.txt
- )
- for /l %%a in (1,1,!m!) do set "_%%a_2="
- )
- ::::::替换大循环::::::
-
- start b1.txt&start b2.txt
复制代码
|