标题: [文本处理] 【已解决】批处理:批量提取特定位置的数据 [打印本页]
作者: 思想之翼 时间: 2014-8-3 23:23 标题: 【已解决】批处理:批量提取特定位置的数据
文件夹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文本
作者: 再世情緣 时间: 2014-8-3 23:40
回复 1# 思想之翼
问下 所有文本1里面的txt文档的格式是一样的吗?
比如:第一行都是
xxx[空格]xxx--xxx[空格]圈圈圈...
xxx代表若干数字
作者: 思想之翼 时间: 2014-8-3 23:41
本帖最后由 思想之翼 于 2014-8-4 00:06 编辑
回复 2# 再世情緣
谢谢关注!
是的,所有txt文档的格式是一样的。
第一行圆圈前有 数据+空格 共19个
第二行数据前有 空格 共11个
作者: 再世情緣 时间: 2014-8-4 00:09
本帖最后由 再世情緣 于 2014-8-4 00:17 编辑
回复 3# 思想之翼
在附件里多添加点txt文档,我试验下
赶紧的,代码基本已将完成。。。只待我试验下。。。。
作者: 思想之翼 时间: 2014-8-4 00:22
回复 4# 再世情緣
好的。谢谢您!
作者: 再世情緣 时间: 2014-8-4 00:33
回复 5# 思想之翼
额。。。文件夹名字到底是“文件夹1” 还是 “文本1”。。。。
作者: 再世情緣 时间: 2014-8-4 00:42
本帖最后由 再世情緣 于 2014-8-4 00:44 编辑
- @echo off &setlocal enabledelayedexpansion &color 0a
- set "var=%cd%"
- set "file=文件夹"
- pushd %var% >nul
- mkdir "%file%2" >nul 2>nul
- for /f "delims=" %%a in ('dir /b /a -d /s "%file%1\*.txt" 2^>nul') do (
- set "txtpath=%%~fa"
- set "txtname=%%~nxa"
- call :main !txtpath!
- pause.>nul
- )
- pause.
- call exit
-
- :main
- for /f "usebackq tokens=3 delims= " %%a in ("%1") do (
- set "code0=%%a" &&set "code0=!code0: =!"
- set "code=!code0:*●=!"
- call :getlen
- for /f "usebackq skip=1" %%a in ("%1") do (
- set "code2=%%a" &&set "code2=!code2: *=!"
- call :getnum
- )
- )
- echo.当前处理文件:[!txtname!]
- echo.获取第一行有效字符:[!code0!]
- echo.获取第二行有效字符:[!code2!]
- echo.第一行 ● 所在位置:!len!
- echo.第二行第 !len! 个字符为: [!num!]
- echo.写入 [!num!] -^> "%cd%\!file!2\!txtname!"
- (echo.!num!)>"%cd%\!file!2\!txtname!"
- goto :eof
-
- :getlen
- if "!code!" EQU "" (
- set /a "len=10"
- goto :eof
- )
- set /a "i=0"
- :getlen_main
- set "code1=!code:~%i%,1!"
- if "!code1!" NEQ "" (
- set /a "i+=1"
- goto :getlen_main
- )
- set /a "len=10-i"
- goto :eof
-
- :getnum
- set /a "len0=len-1"
- set "num=!code2:~%len0%,1!"
- goto :eof
复制代码
说明:保存为bat之后,放在“文件夹1”同目录下,代码第三行复制代码
这里自定义你的文件夹的名字,不用带后面的数字,有问题回复我
代码中间- echo.当前处理文件:[!txtname!]
- echo.获取第一行有效字符:[!code0!]
- echo.获取第二行有效字符:[!code2!]
- echo.第一行 ● 所在位置:!len!
- echo.第二行第 !len! 个字符为: [!num!]
- echo.写入 [!num!] -^> "%cd%\!file!2\!txtname!"
复制代码
部分为cmd窗口显示内容,可以删除,注意别把- (echo.!num!)>"%cd%\!file!2\!txtname!"
复制代码
也删了。。。
代码可能会很繁琐。。。。
作者: 思想之翼 时间: 2014-8-4 00:58
回复 7# 再世情緣
谢谢您的帮助!
经测试,只能自动提取001.txt,之后按一次回车键运行002.txt,再按回车键运行003.txt...要不停地按回车键
作者: 再世情緣 时间: 2014-8-4 01:03
本帖最后由 再世情緣 于 2014-8-4 01:22 编辑
回复 8# 思想之翼
额。。。。这是我自己测试的时候,为了查错,弄的,你把第十行复制代码
删了就好了,或者改为复制代码
注释掉也行
作者: 思想之翼 时间: 2014-8-4 01:12
回复 9# 再世情緣
谢谢您给予的大力帮助,测试后解决问题。
但是产生了一个新问题:
需要提取“文本1”里的210个txt数据,写入“文件夹1”
需要提取“文本2”里的210个txt数据,写入“文件夹2”
需要提取“文本3”里的210个txt数据,写入“文件夹3”
...
您写的代码,修改哪里?
作者: xxpinqz 时间: 2014-8-4 01:12
回复 7# 再世情緣
取位置不用那么麻烦,类似这样:- @echo off&setlocal enabledelayedexpansion
- set "a=1397820564"
- set "b=117 92--9023465718 ●○○○○○○○○○#a9876543210"
- set "b=%b:*●=%"
- set /a len=0x%b:~10,1%
- echo,!a:~-%len%,1!
- pause
复制代码
作者: 再世情緣 时间: 2014-8-4 01:14
回复 10# 思想之翼
。。。。你的意思是还有好多类似的文本1.....文件夹??
作者: 再世情緣 时间: 2014-8-4 01:16
回复 11# xxpinqz
额。。。。佩服!!!你脑袋怎么长得。。。。怎么能想出来如此办法。。。
作者: 思想之翼 时间: 2014-8-4 01:24
回复 13# 再世情緣
再经过测试,代码出错了:改变110.txt 181.txt 190.txt 等文本的数据(格式不变),得到的结果依然是原先的数据。
作者: xxpinqz 时间: 2014-8-4 01:26
本帖最后由 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=
大体这样会提升点效率:- @echo off&setlocal enabledelayedexpansion
- cd /d "C:\文本1"
- for %%i in (*.txt) do (
- for /f "tokens=*" %%a in (%%i) do (
- if defined str (
- set "num=%%~nxa"
- for %%b in (!len!) do echo,!num:~-%%b,1!
- set "str="
- ) else (
- set "str=%%~nxa#a9876543210"
- set "str=!str:*●=!"
- set /a len=0x!str:~10,1!
- )
- )
- )>"C:\文件夹1\%%~nxi"
复制代码
作者: 思想之翼 时间: 2014-8-4 01:37
回复 15# xxpinqz
问题解决了,谢谢!
作者: 再世情緣 时间: 2014-8-4 01:52
本帖最后由 再世情緣 于 2014-8-4 01:56 编辑
回复 16# 思想之翼
综合了之前那位朋友的方法,之后生成了目前的代码,但是,还是不可避免的要call一次。。。。- @echo off &setlocal enabledelayedexpansion &color 0a
- set "var=%cd%"
- set "file1=文本"
- set "file2=文件夹"
- pushd %var% >nul
- for /l %%i in (1,1,9999) do (
- if exist "!file1!%%i\*.txt" (
- set "f1=!file1!%%i"
- set "f2=!file2!%%i"
- mkdir "!f2!" >nul 2>nul
- call :head
- )
- )
- pause.
- call exit
-
- :head
- for /f "delims=" %%a in ('dir /b /a -d /s "%f1%\*.txt" 2^>nul') do (
- set "txtpath=%%~fa"
- set "txtname=%%~nxa"
- call :main !txtpath!
- rem pause.>nul
- )
- rem pause.
- goto :eof
-
- :main
- for /f "usebackq tokens=3 delims= " %%a in ("%1") do (
- set "code0=%%a" &&set "code0=!code0: =!"
- set "code=!code0:*●=!" &&set "code=!code!#a9876543210"
- for /f "usebackq skip=1" %%a in ("%1") do (
- set "code2=%%a" &&set "code2=!code2: *=!"
- set /a "len=0x!code:~10,1!","len0=11-len"
- call :getnum
- )
- )
- echo.当前处理文件:[!txtname!]
- echo.获取第一行有效字符:[!code0!]
- echo.获取第二行有效字符:[!code2!]
- echo.第一行 ● 所在位置:!len0!
- echo.第二行第 !len0! 个字符为: [!num!]
- echo.写入 [!num!] -^> "%cd%\!f2!\!txtname!"
- (echo.!num!)>"%cd%\!f2!\!txtname!"
- goto :eof
-
- :getnum
- set "num=!code2:~-%len%,1!"
- goto :eof
复制代码
作者: terse 时间: 2014-8-4 12:40
回复 15# xxpinqz
Len 的值可不用加 /a 效率提升
作者: CrLf 时间: 2014-8-10 17:59
本帖最后由 CrLf 于 2014-8-11 05:42 编辑
回复 15# xxpinqz
提供一种用于此类特殊情况的长度算法:- set "a=●○○○○○○○○○"
-
- set "b=%a:*●=%"
- set /a "len=0%b:○=+1%"
复制代码
----------------------------------------------------------------
还有求余的办法:- set "a=●○○○○○○○○○"
-
- set "b=%a:*●=%"
- set /a "c=%b:○=1%,len=c/1000%%9+c%1000%%9"
复制代码
以前用 % 运算来改良生命游戏算法,和现在这个情况太相似了
----------------------------------------------------------------
还有一种思路也属于表驱动法,但用的是 for:- set "a=●○○○○○○○○○"
-
- set "b=%a:*●=%"
- for /f "tokens=10" %%a in ("%b:○=. %9 8 7 6 5 4 3 2 1 0") do set "len=%%a"
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |