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

测试于 win7 64位
  1. @echo off & setlocal enabledelayedexpansion
  2. >result.txt cd.
  3. for /f "tokens=1,2 delims=-" %%a in (截取号码段.txt) do (
  4.     set "a=%%a" & set "b=%%b" & set "name=!a:~0,4!"
  5.     for /f tokens^=2delims^=: %%i in ('find /c /v "" "!name!.txt"') do set /a "lb=0, ub=%%i, sk=ub/2"
  6.     call :PAfterLines "!name!.txt" "!a:~0,13!" 0
  7.     call :writeTemp "!name!.txt" tmpfile new
  8.     sort /r tmpfile /o tmpfile
  9.     for /f tokens^=2delims^=: %%i in ('find /c /v "" tmpfile') do set /a "lb=0, ub=%%i, sk=ub/2"
  10.     call :PAfterLines tmpfile "!b:~0,13!" -1
  11.     call :writeTemp tmpfile result.txt
  12. )
  13. sort result.txt /o result.txt
  14. del tmpfile
  15. pause
  16. exit
  17. :writeTemp infile outfile new
  18. if "%3" neq "" >"%~2" cd.
  19. if !sk! equ 0 (copy "%~2" + "%~1" "%~2" & exit /b)
  20. >>"%~2"  (for /f skip^=%sk% %%a in (%~s1) do echo;%%a)
  21. exit /b
  22. REM order = 0 升序 order = -1 反序
  23. :PAfterLines file str order
  24. if !sk! equ 0 exit /b
  25. for /f skip^=%sk% %%a in (%~1) do (
  26.     if !lb! geq !ub! exit /b
  27.     if "%%a" gtr "%~2" (
  28.         set /a "ub=(~%3 & sk)|(%3 & ub), lb=(~%3 & lb)| (%3 & (sk+^!(lb-sk))), sk=(lb+ub)>>1"
  29.         call :PAfterLines %~1 %~2 %3 &  exit /b
  30.     ) else if "%%a" equ "%~2" (         exit /b
  31.     ) else (
  32.         set /a "lb=(~%3 & (sk+^!(lb-sk)))|(%3 & lb), ub=(~%3 & ub)|(%3 & sk), sk=(lb+ub)>>1"
  33.         call :PAfterLines %~1 %~2 %3 &  exit /b
  34.     )
  35. )
  36. exit /b
复制代码
1

评分人数

    • winbat: 测试代码能过技术 + 1

TOP

本帖最后由 aa77dd@163.com 于 2016-10-1 14:04 编辑

回复 22# winbat

我测试是所有文件都在同一目录

好吧   我知道楼主是一点批处理也不会了   只用在 截取号码段.txt 前加上目录 tmp\ 就行了

仍有疑问, 下载完整测试包
http://pan.baidu.com/s/1gfr1Kyv
  1. @echo off & setlocal enabledelayedexpansion
  2. >result.txt cd.
  3. for /f "tokens=1,2 delims=-" %%a in (tmp\截取号码段.txt) do (
  4.     set "a=%%a" & set "b=%%b" & set "name=!a:~0,4!"
  5.     for /f tokens^=2delims^=: %%i in ('find /c /v "" "!name!.txt"') do set /a "lb=0, ub=%%i, sk=ub/2"
  6.     call :PAfterLines "!name!.txt" "!a:~0,13!" 0
  7.     call :writeTemp "!name!.txt" tmpfile new
  8.     sort /r tmpfile /o tmpfile
  9.     for /f tokens^=2delims^=: %%i in ('find /c /v "" tmpfile') do set /a "lb=0, ub=%%i, sk=ub/2"
  10.     call :PAfterLines tmpfile "!b:~0,13!" -1
  11.     call :writeTemp tmpfile result.txt
  12. )
  13. sort result.txt /o result.txt
  14. del tmpfile
  15. fc result.txt 期待结果.txt
  16. pause
  17. exit
  18. :writeTemp infile outfile new
  19. if "%3" neq "" >"%~2" cd.
  20. if !sk! equ 0 (copy "%~2" + "%~1" "%~2" & exit /b)
  21. >>"%~2"  (for /f skip^=%sk% %%a in (%~s1) do echo;%%a)
  22. exit /b
  23. REM order = 0 升序 order = -1 反序
  24. :PAfterLines file str order
  25. if !sk! equ 0 exit /b
  26. for /f skip^=%sk% %%a in (%~1) do (
  27.     if !lb! geq !ub! exit /b
  28.     if "%%a" gtr "%~2" (
  29.         set /a "ub=(~%3 & sk)|(%3 & ub), lb=(~%3 & lb)| (%3 & (sk+^!(lb-sk))), sk=(lb+ub)>>1"
  30.         call :PAfterLines %~1 %~2 %3 &  exit /b
  31.     ) else if "%%a" equ "%~2" (         exit /b
  32.     ) else (
  33.         set /a "lb=(~%3 & (sk+^!(lb-sk)))|(%3 & lb), ub=(~%3 & ub)|(%3 & sk), sk=(lb+ub)>>1"
  34.         call :PAfterLines %~1 %~2 %3 &  exit /b
  35.     )
  36. )
  37. exit /b
复制代码
1

评分人数

    • winbat: 测试代码结果正解技术 + 1

TOP

返回列表