找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 92449|回复: 18

[文本处理] 【已解决】批处理:批量提取特定位置的数据

[复制链接]
发表于 2014-8-3 23:23:01 | 显示全部楼层 |阅读模式
文件夹C:/文本1/ 内有210个txt文本,分别命名为001-210.txt。每个txt文本内有两行数据,格式见附件。第一行数据有9个空心圈,1个实心圈;第二行是10个数据。现在欲根据实心圈的位置,提取对应位置的第二行数据,用bat、vbs能够实现吗?
举例:
001.txt 文本内的数据为:
117 92--9023465718 ●○○○○○○○○○
           1397820564  
第一行10个圈,实心圈位于第一位,则提取第二行10个数据的第一位 1 ,写入C:/文本2/ 内的001.txt文本
若第一行10个圈实心圈位于第二位,则提取第二行10个数据的第二位 3 ,写入C:/文本2/ 内的001.txt文本

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2014-8-3 23:40:08 | 显示全部楼层
回复 1# 思想之翼


    问下  所有文本1里面的txt文档的格式是一样的吗?
比如:第一行都是
xxx[空格]xxx--xxx[空格]圈圈圈...
xxx代表若干数字
 楼主| 发表于 2014-8-3 23:41:01 | 显示全部楼层
本帖最后由 思想之翼 于 2014-8-4 00:06 编辑

回复 2# 再世情緣

谢谢关注!
是的,所有txt文档的格式是一样的。
第一行圆圈前有 数据+空格 共19个
第二行数据前有 空格 共11个
发表于 2014-8-4 00:09:51 | 显示全部楼层
本帖最后由 再世情緣 于 2014-8-4 00:17 编辑

回复 3# 思想之翼


    在附件里多添加点txt文档,我试验下
   赶紧的,代码基本已将完成。。。只待我试验下。。。。
 楼主| 发表于 2014-8-4 00:22:13 | 显示全部楼层
回复 4# 再世情緣


   好的。谢谢您!
发表于 2014-8-4 00:33:01 | 显示全部楼层
回复 5# 思想之翼


    额。。。文件夹名字到底是“文件夹1” 还是 “文本1”。。。。
发表于 2014-8-4 00:42:32 | 显示全部楼层
本帖最后由 再世情緣 于 2014-8-4 00:44 编辑

  1. @echo off &setlocal enabledelayedexpansion &color 0a
  2. set "var=%cd%"
  3. set "file=文件夹"
  4. pushd %var% >nul
  5. mkdir "%file%2" >nul 2>nul
  6. for /f "delims=" %%a in ('dir /b /a -d /s "%file%1\*.txt" 2^>nul') do (
  7.   set "txtpath=%%~fa"
  8.   set "txtname=%%~nxa"
  9.   call :main !txtpath!
  10.   pause.>nul
  11. )
  12. pause.
  13. call exit

  14. :main
  15. for /f "usebackq tokens=3 delims= " %%a in ("%1") do (
  16.   set "code0=%%a" &&set "code0=!code0: =!"
  17.   set "code=!code0:*●=!"
  18.   call :getlen
  19.   for /f "usebackq skip=1" %%a in ("%1") do (
  20.     set "code2=%%a" &&set "code2=!code2: *=!"
  21.     call :getnum
  22.   )
  23. )
  24. echo.当前处理文件:[!txtname!]
  25. echo.获取第一行有效字符:[!code0!]
  26. echo.获取第二行有效字符:[!code2!]
  27. echo.第一行 ● 所在位置:!len!
  28. echo.第二行第 !len! 个字符为: [!num!]
  29. echo.写入 [!num!] -^> "%cd%\!file!2\!txtname!"
  30. (echo.!num!)>"%cd%\!file!2\!txtname!"
  31. goto :eof

  32. :getlen
  33. if "!code!" EQU "" (
  34.   set /a "len=10"
  35.   goto :eof
  36. )
  37. set /a "i=0"
  38. :getlen_main
  39. set "code1=!code:~%i%,1!"
  40. if "!code1!" NEQ "" (
  41.   set /a "i+=1"
  42.   goto :getlen_main
  43. )
  44. set /a "len=10-i"
  45. goto :eof

  46. :getnum
  47. set /a "len0=len-1"
  48. set "num=!code2:~%len0%,1!"
  49. goto :eof
复制代码
说明:保存为bat之后,放在“文件夹1”同目录下,代码第三行
  1. set "file=文件夹"
复制代码
这里自定义你的文件夹的名字,不用带后面的数字,有问题回复我
代码中间
  1. echo.当前处理文件:[!txtname!]
  2. echo.获取第一行有效字符:[!code0!]
  3. echo.获取第二行有效字符:[!code2!]
  4. echo.第一行 ● 所在位置:!len!
  5. echo.第二行第 !len! 个字符为: [!num!]
  6. echo.写入 [!num!] -^> "%cd%\!file!2\!txtname!"
复制代码
部分为cmd窗口显示内容,可以删除,注意别把
  1. (echo.!num!)>"%cd%\!file!2\!txtname!"
复制代码
也删了。。。

代码可能会很繁琐。。。。

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢

查看全部评分

 楼主| 发表于 2014-8-4 00:58:18 | 显示全部楼层
回复 7# 再世情緣

谢谢您的帮助!
经测试,只能自动提取001.txt,之后按一次回车键运行002.txt,再按回车键运行003.txt...要不停地按回车键
发表于 2014-8-4 01:03:57 | 显示全部楼层
本帖最后由 再世情緣 于 2014-8-4 01:22 编辑

回复 8# 思想之翼


    额。。。。这是我自己测试的时候,为了查错,弄的,你把第十行
  1. pause.>nul
复制代码
删了就好了,或者改为
  1. rem pause.>nul
复制代码
注释掉也行
 楼主| 发表于 2014-8-4 01:12:29 | 显示全部楼层
回复 9# 再世情緣

谢谢您给予的大力帮助,测试后解决问题。
但是产生了一个新问题:
需要提取“文本1”里的210个txt数据,写入“文件夹1”
需要提取“文本2”里的210个txt数据,写入“文件夹2”
需要提取“文本3”里的210个txt数据,写入“文件夹3”
...
您写的代码,修改哪里?
发表于 2014-8-4 01:12:53 | 显示全部楼层
回复 7# 再世情緣

取位置不用那么麻烦,类似这样:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "a=1397820564"
  3. set "b=117 92--9023465718 ●○○○○○○○○○#a9876543210"
  4. set "b=%b:*●=%"
  5. set /a len=0x%b:~10,1%
  6. echo,!a:~-%len%,1!
  7. pause
复制代码
发表于 2014-8-4 01:14:07 | 显示全部楼层
回复 10# 思想之翼


    。。。。你的意思是还有好多类似的文本1.....文件夹??
发表于 2014-8-4 01:16:23 | 显示全部楼层
回复 11# xxpinqz


    额。。。。佩服!!!你脑袋怎么长得。。。。怎么能想出来如此办法。。。
 楼主| 发表于 2014-8-4 01:24:28 | 显示全部楼层
回复 13# 再世情緣

再经过测试,代码出错了:改变110.txt  181.txt  190.txt  等文本的数据(格式不变),得到的结果依然是原先的数据。
发表于 2014-8-4 01:26:53 | 显示全部楼层
本帖最后由 xxpinqz 于 2014-8-4 01:44 编辑

回复 13# 再世情緣

拾人牙慧而已,这算法是大佬们写的。
http://www.bathome.net/thread-5861-1-1.html
http://www.bathome.net/viewthread.php?tid=11799&highlight=
大体这样会提升点效率:
  1. @echo off&setlocal enabledelayedexpansion
  2. cd /d "C:\文本1"
  3. for %%i in (*.txt) do (
  4.     for /f "tokens=*" %%a in (%%i) do (
  5.       if defined str (
  6.               set "num=%%~nxa"
  7.               for %%b in (!len!) do echo,!num:~-%%b,1!
  8.               set "str="
  9.       ) else (
  10.         set "str=%%~nxa#a9876543210"
  11.         set "str=!str:*●=!"
  12.         set /a len=0x!str:~10,1!
  13.       )  
  14.     )
  15. )>"C:\文件夹1\%%~nxi"
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢!问题解决了。

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 20:52 , Processed in 0.022764 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表