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

[文本处理] [已解决]批处理如何获取TXT每行的长度输出原字符及长度?

有一个记事本11.txt文件如
123456
12123
456456
1231231223123
567489789777777777
57498789212

想让他输出一个22.TXT 内容为
123456 6
12123 5
456456 6
1231231223123 13
567489789777777777 18
57498789212 11


@echo off&setlocal
>>2.txt,echo.
for /f "tokens=1 delims=:" %%a in ('findstr /o .* 11.txt') do call :9527 %%a
pause>nul
goto:eof
:9527
if not defined b (set b=%1&goto:eof)
(set a=%b%)&&(set b=%1)
set /a c=b-a-2
call,echo %%c%%>>22.txt

但我怎么才能输出 原来的每行文字 加上他的长度呢
试过echo %a %%c%%
不行

[ 本帖最后由 xianxian 于 2010-8-13 02:28 编辑 ]

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set n=0
  4. for /f "delims=" %%a in (a.txt) do (
  5.   set str=%%a
  6.   call :lp
  7. )
  8. pause
  9. :lp
  10. set /a n+=1
  11. for /f %%i in ("%n%") do if not "!str:~%%i,1!"=="" (goto lp) else (echo !str! !n! &&set n=0)
复制代码
1

评分人数

努力学习,努力挣分

TOP

多谢了楼上的 可以用

TOP

注意  字节和字符的不同结果
  1. @echo off
  2. set /a x=8190,i=0
  3. for /f "tokens=*" %%i in (11.txt) do (
  4.     set "str=%%i"
  5.     setlocal enabledelayedexpansion
  6.     for /l %%a in (1,1,14) do (
  7.     set /a "n=(x+i)/2"
  8.     for %%b in (!n!) do if "!str:~%%b!" equ "" (set /a x=n) else set /a i=n
  9.     )
  10.     set/a "n+=1,mun+=n"
  11.     >_tem set/p=!str!<nul
  12.     for %%c in (_tem) do set z=%%~zc
  13.     echo !str! !n!字符 !z!字节
  14.     endlocal
  15. )
  16. del _tem
  17. pause
复制代码
1

评分人数

TOP

我觉得楼上这种算法比较精妙哦:
  1. @echo off&setlocal enabledelayedexpansion
  2. set x=8190
  3. for /l %%i in (1,1,14) do (
  4.     set/a "n=(x+i)/2"
  5.     set/a i=n
  6. )
  7. set/a n+=1
  8. echo %n%  等于 %x%
  9. pause
复制代码

8190除以2这样一直除下去得到的都是奇数,而在cmd中奇数n/2的话等于(n-1)/2,会有数字丢失。
所以如果我下面这种常规折半法开始set x=8190的话,算出来的字符串长度会比真实的少。
于是只好set x=8192这样一直除下去得到的都是偶数,就能得到正确结果。
但是楼上采用的公式就避免了这种情况,我数学不好,不知道这个公式叫什么名字.......
附:我所用的“常规”折半法:
  1. @echo off
  2. set x=8192
  3. for /f "delims=" %%i in (a.txt) do (
  4.     set "str=%%i"
  5.     SetLocal EnableDelayedExpansion
  6.     for /l %%j in (1,1,14) do (
  7.     for %%a in (!x!) do if "!str:~%%a!"=="" (set/a x/=2) else (set/a n+=x&set "str=!str:~%%a!"&set/a x/=2))
  8.     set/a n+=1
  9.     echo %%i    !n!字符
  10.     endlocal
  11. )
  12. pause
复制代码

[ 本帖最后由 wankoilz 于 2010-7-26 15:01 编辑 ]

TOP

@echo off
for /f "tokens=1* delims=:" %%i in ('^(type 11.txt^&echo.^)^|findstr /o .') do (if not "%%i" == "0" set/a n2=%%i-n1-2,n1=%%i&call echo %%x%% %%n2%%)&set "x=%%j"
pause>nul
1

评分人数

TOP

  1. @echo off
  2. for /f "tokens=*" %%a in (11.txt) do (
  3.         setlocal enabledelayedexpansion
  4.         set s=%%a&>_tem set/p=%%a<nul
  5.         for %%b in (_tem) do (
  6.                 set /a e=%%~zb/2
  7.                 for /l %%c in (%%~zb -1 !e!) do if  "!s:~%%c!" == "" set d=%%c
  8.                 call echo %%a %%~zb字节 %%d%%字符
  9.         )
  10.         endlocal        
  11. )
  12. del _tem
  13. pause
复制代码

[ 本帖最后由 pgfj18 于 2010-7-27 14:18 编辑 ]
1

评分人数

TOP

6楼7楼代码简短,但是效率相对要低点。
顺便提醒下楼上的兄弟记得用[code]把代码扩起来,具体方法见:http://bbs.bathome.net/thread-404-1-1.html

TOP

返回列表