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

[文本处理] [已解决]批处理如何根据指定文本列出的数字号码段提取其他多个文本内容数字号码

批处理截取指定文本号码段内容问题
问题:
tmp 文件夹下有 N 个号码段文本(0000.txt;0001.txt;1250.txt等),工作需求是通过读取指定“截取号码段.txt”,截取 tmp 文件夹(0000.txt;0001.txt;1250.txt等)下相对映的号码段文本内容,输出到新建文本。
提示:号码段前4位为号码段文本名,5-11位为顺序码

结果如下图:


----------------------------------------------------------------------
之前 @aa77dd@163.com 在26楼时给的测试代码对 test 13位字符串测试结果是对的,但实际另一批产品字符串为14位,我改了下代码测试运行发现截取结果偏差很大(小弟吾水平太烂的原因)。后只能AT求助于 @pcl_test兄 得於解决。
在此:
非常感谢 @aa77dd@163.com @pcl_test  @codegay @WHY 坛友们的热心建议及帮助。

附件:
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 31# WHY

代码运行结果 copy 合并,没达到效果。但还是要谢谢 @WHY 兄 ,问题已解决了。

TOP

  1. @echo off & setlocal enabledelayedexpansion
  2. copy /b *.txt a.Log
  3. for /f "tokens=1,2delims=-" %%i in (tmp\截取号码段.txt) do (
  4.     set /a n+=1
  5.     set _%%i_!n!=1&set _%%j.!n!=1
  6. )
  7. set n=1
  8. (for /f "delims=" %%i in ('sort a.Log') do (
  9.     if defined _%%i_!n! set flag=1
  10.     if defined flag echo;%%i
  11.     if defined _%%i.!n! (set /a n+=1 & set flag=)
  12. ))>result.Log
  13. pause
复制代码

TOP

回复 29# winbat


    楼主你当真在这个论坛学东西了吗?

TOP

回复 26# aa77dd@163.com


    谢谢,@aa77dd@163.com 代码测试通过,手工试了另一批产品结果 号码段及数量 都对,非常感谢 @aa77dd@163.com @pcl_test  @codegay 及热帮助的坛友们。
这里是个很能让人学习到东西的地方,期望坛子越来越好!最后祝大家国庆快乐!

TOP

回复 27# codegay


    嗯,是条形码

TOP

这些是号码是条形码?
还是门店之类编码?
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

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

回复 23# pcl_test


    好的,谢谢 @pcl_test 老大 国庆节快乐!

TOP

回复 20# codegay


    国庆节快乐!不懂 py3 机子到装了 py2.7 , 数据处理并不需要分割,不好意思你理解错了这是我的错,图片只为了更直观的了解。截取结果是例如上传的 result.txt 输出结果。

TOP

本帖最后由 pcl_test 于 2016-10-1 12:41 编辑

回复 21# winbat

嗯,我以你顶楼给出的样本测试没有问题,自行找原因或者把QQ私密我吧

TOP

回复 19# aa77dd@163.com


    生成 result.txt ,内容是合并号码段文本,没截取

cmd 回显:

tmpfile
0000.txt
已复制         1 个文件。
tmpfile
1250.txt
已复制         1 个文件。
请按任意键继续. . .

TOP

回复 18# pcl_test


   生成 结果.txt 文本但没内容

TOP

本帖最后由 codegay 于 2016-10-1 01:52 编辑

python3
楼主这个数据源太不多科学了。应该切分成列合并,统一存到一个数据库或者表格中。需要的时候再查询出来。
尼马地这样各种分片拼接字符串,又搞各种类型转换,麻烦累,效率还低。
  1. #2016年10月1日 00:25:33 codegay
  2. with open("截取号码段.txt") as f:
  3. 号码段 =  [r.strip().split("-") for r in f.readlines()]
  4. result = []
  5. for s,e in 号码段:
  6. fn = s[:4] #filename
  7. start = s[4:11]
  8. end = e[4:11]
  9. numlist = [fn+str(r).rjust(7,'0') for r in range(int(start),int(end)+1)]
  10. with open(fn+".txt") as f:
  11. txt = f.readlines()
  12. for n in numlist:
  13. result += [l for l in txt if l.startswith(n)]
  14. print(result)
  15. with open("newresult.txt","w+") as f:
  16. f.writelines(result)
复制代码
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

回复 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

返回列表