标题: [文本处理] [已解决]批处理如何根据指定文本列出的数字号码段提取其他多个文本内容数字号码 [打印本页]
作者: winbat 时间: 2016-9-30 11:52 标题: [已解决]批处理如何根据指定文本列出的数字号码段提取其他多个文本内容数字号码
批处理截取指定文本号码段内容问题
问题:
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 坛友们的热心建议及帮助。
附件:
作者: pcl_test 时间: 2016-9-30 12:38
本帖最后由 pcl_test 于 2016-9-30 12:53 编辑
1、不需要贴不能满足你需求的代码
2、优先文字说明,能用文字说明清楚的勿发图片
3、上传的附件需压缩打包
4、对应关系没有明确说明
作者: winbat 时间: 2016-9-30 13:12
回复 2# pcl_test
谢谢,@pcl_test 老大的点醒,下次改正!
作者: winbat 时间: 2016-9-30 14:00
回复 4# pcl_test
试了下代码,没输出
作者: pcl_test 时间: 2016-9-30 14:01
猜- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1,2 delims=-" %%a in ('type "截取号码段.txt"') do (
- set "a=%%a"&set "b=%%b"
- set "name=!a:~,4!"
- if not defined #!name! set "#!name!=1"
- for /l %%c in (1!a:~4^,7! 1 1!b:~4^,7!) do set "_!name!%%c=1"
- )
- for /f "tokens=1 delims=#=" %%a in ('set #') do (
- for /f "delims=" %%i in ('type "%%a.txt"') do (
- set "c=%%i"
- for %%k in (!c:~4^,7!) do if defined _%%a1%%k echo;%%i
- )
- )
- pause
复制代码
作者: pcl_test 时间: 2016-9-30 14:07
回复 4# winbat
cmd窗口没输出,还是没有输出到txt文本,还是什么都没输出?如果是没有输出到txt文本,自行添加
作者: winbat 时间: 2016-9-30 14:21
本帖最后由 pcl_test 于 2016-9-30 14:26 编辑
回复 6# pcl_test
……
set "c=%%i"
for %%k in (!c:~4^,7!) do if defined _%%a1%%k echo;%%i
>>result.txt echo %%i
)
)
pause
没截取成功,只是合并了几个要截取的号码段文本
作者: pcl_test 时间: 2016-9-30 14:25
本帖最后由 pcl_test 于 2016-9-30 14:57 编辑
回复 7# winbat
cmd窗口的输出结果呢?你确定你添加对了?
http://www.bathome.net/thread-2516-1-1.html
5楼11行
for %%k in (!c:~4^,7!) do if defined _%%a1%%k >>"学学基础知识.txt" echo;%%i
作者: winbat 时间: 2016-9-30 15:27
本帖最后由 pcl_test 于 2016-9-30 15:32 编辑
回复 8# pcl_test
CMD 没输出结果,输出文本都没生成
作者: pcl_test 时间: 2016-9-30 15:35
回复 9# winbat
不要重复贴码
把顶楼的除了result.txt之外的所有txt文件跟bat文件放一起运行
作者: winbat 时间: 2016-9-30 15:41
回复 10# pcl_test
放了,都放在一个文件夹下运行的
作者: pcl_test 时间: 2016-9-30 15:44
回复 11# winbat
不改5楼的代码直接运行显示什么
作者: winbat 时间: 2016-9-30 15:52
回复 12# pcl_test
代码运行显示: “ 请按任意键继续. . . ”
回车后,没输出生成文本
作者: pcl_test 时间: 2016-9-30 16:01
本帖最后由 pcl_test 于 2016-9-30 16:02 编辑
回复 13# winbat - @echo off&setlocal enabledelayedexpansion
- if not exist "截取号码段.txt" echo;not exist
- for /f "tokens=1,2 delims=-" %%a in ('type "截取号码段.txt"') do (
- set "a=%%a"&set "b=%%b"
- set "name=!a:~,4!"
- if not defined #!name! (
- set "#!name!=1"
- if not exist "!name!.txt" echo;!name! not exist
- )
- for /l %%c in (1!a:~4^,7! 1 1!b:~4^,7!) do set "_!name!%%c=1"
- )
- set #
- pause
复制代码
这样呢,显示什么
作者: winbat 时间: 2016-9-30 16:14
回复 14# pcl_test
显示:- #0000=1
- #0001=1
- #1250=1
- 请按任意键继续. . .
复制代码
作者: pcl_test 时间: 2016-9-30 16:19
回复 15# winbat
核对下代码,不改5楼的代码直接运行只显示“请按任意键继续. . . ”么?
作者: winbat 时间: 2016-9-30 17:59
本帖最后由 pcl_test 于 2016-9-30 18:18 编辑
回复 16# pcl_test
// 5 楼的代码运行只 cmd 回显,“ 请按任意键继续. . . ”
// 号码段文本\批处理等全放在一个文件夹,添加 8 楼 输出代码 运行,没输出
作者: pcl_test 时间: 2016-9-30 18:33
本帖最后由 pcl_test 于 2016-12-1 19:34 编辑
回复 17# winbat - //&cls&cd /d "%~dp0"&cscript -nologo -e:jscript "%~f0"&pause&exit
-
- var fso = new ActiveXObject('Scripting.FileSystemObject');
- var file = '截取号码段.txt';
- var s = '', files={}, list={};
- if(!fso.FileExists(file))WSH.Echo(file+'不存在');
- var text = fso.OpenTextFile(file, 1).ReadAll().split(/[\r\n]/);
- for(var i=0; i<text.length; i++){
- var name = text[i].slice(0,4);
- if(!files[name])files[name]=1;
- text[i].replace(/\d{4}(\d{7})\d{2}-\d{4}(\d{7})\d{2}/, function(a,b,c){
- for(var j=Number(1+''+b);j<=Number(1+''+c);j++){
- list[name+(''+j).slice(1)]=j
- }
- })
- }
- for(var f in files){
- if(!fso.FileExists(f+'.txt')){
- WSH.Echo(f+'.txt不存在')
- }else{
- try{
- var ftext = fso.OpenTextFile(f+'.txt', 1).ReadAll().split(/[\r\n]/);
- for(var i=0; i<ftext.length; i++){
- var str = ftext[i].replace(/^\s*|\s*$/g,'');
- if(!/^\d{13}$/.test(str))WSH.Echo(f+'.txt:第'+(i+1)+'行['+str+']含有非数字字符或长度不为13位');
- if(list[str.slice(0,11)])s+=str+'\r\n';
- }
- }catch(e){WSH.Echo(f+'.txt为空文件')}
- }
- }
- fso.CreateTextFile('结果.txt', 2).Write(s);
复制代码
这样呢,显示什么
作者: aa77dd@163.com 时间: 2016-9-30 21:46
回复 1# winbat
测试于 win7 64位- @echo off & setlocal enabledelayedexpansion
-
- >result.txt cd.
-
- for /f "tokens=1,2 delims=-" %%a in (截取号码段.txt) do (
-
- set "a=%%a" & set "b=%%b" & set "name=!a:~0,4!"
-
- for /f tokens^=2delims^=: %%i in ('find /c /v "" "!name!.txt"') do set /a "lb=0, ub=%%i, sk=ub/2"
- call :PAfterLines "!name!.txt" "!a:~0,13!" 0
-
- call :writeTemp "!name!.txt" tmpfile new
- sort /r tmpfile /o tmpfile
-
- for /f tokens^=2delims^=: %%i in ('find /c /v "" tmpfile') do set /a "lb=0, ub=%%i, sk=ub/2"
- call :PAfterLines tmpfile "!b:~0,13!" -1
- call :writeTemp tmpfile result.txt
- )
- sort result.txt /o result.txt
- del tmpfile
- pause
- exit
-
-
- :writeTemp infile outfile new
- if "%3" neq "" >"%~2" cd.
- if !sk! equ 0 (copy "%~2" + "%~1" "%~2" & exit /b)
- >>"%~2" (for /f skip^=%sk% %%a in (%~s1) do echo;%%a)
- exit /b
-
-
- REM order = 0 升序 order = -1 反序
- :PAfterLines file str order
- if !sk! equ 0 exit /b
- for /f skip^=%sk% %%a in (%~1) do (
- if !lb! geq !ub! exit /b
- if "%%a" gtr "%~2" (
- set /a "ub=(~%3 & sk)|(%3 & ub), lb=(~%3 & lb)| (%3 & (sk+^!(lb-sk))), sk=(lb+ub)>>1"
- call :PAfterLines %~1 %~2 %3 & exit /b
- ) else if "%%a" equ "%~2" ( exit /b
- ) else (
- set /a "lb=(~%3 & (sk+^!(lb-sk)))|(%3 & lb), ub=(~%3 & ub)|(%3 & sk), sk=(lb+ub)>>1"
- call :PAfterLines %~1 %~2 %3 & exit /b
- )
- )
- exit /b
复制代码
作者: codegay 时间: 2016-10-1 01:50
本帖最后由 codegay 于 2016-10-1 01:52 编辑
python3
楼主这个数据源太不多科学了。应该切分成列合并,统一存到一个数据库或者表格中。需要的时候再查询出来。
尼马地这样各种分片拼接字符串,又搞各种类型转换,麻烦累,效率还低。- #2016年10月1日 00:25:33 codegay
-
- with open("截取号码段.txt") as f:
- 号码段 = [r.strip().split("-") for r in f.readlines()]
- result = []
- for s,e in 号码段:
- fn = s[:4] #filename
- start = s[4:11]
- end = e[4:11]
- numlist = [fn+str(r).rjust(7,'0') for r in range(int(start),int(end)+1)]
- with open(fn+".txt") as f:
- txt = f.readlines()
- for n in numlist:
- result += [l for l in txt if l.startswith(n)]
-
- print(result)
-
- with open("newresult.txt","w+") as f:
- f.writelines(result)
复制代码
作者: winbat 时间: 2016-10-1 12:37
回复 18# pcl_test
生成 结果.txt 文本但没内容
作者: winbat 时间: 2016-10-1 12:38
回复 19# aa77dd@163.com
生成 result.txt ,内容是合并号码段文本,没截取
cmd 回显:
tmpfile
0000.txt
已复制 1 个文件。
tmpfile
1250.txt
已复制 1 个文件。
请按任意键继续. . .
作者: pcl_test 时间: 2016-10-1 12:40
本帖最后由 pcl_test 于 2016-10-1 12:41 编辑
回复 21# winbat
嗯,我以你顶楼给出的样本测试没有问题,自行找原因或者把QQ私密我吧
作者: winbat 时间: 2016-10-1 12:45
回复 20# codegay
国庆节快乐!不懂 py3 机子到装了 py2.7 , 数据处理并不需要分割,不好意思你理解错了这是我的错,图片只为了更直观的了解。截取结果是例如上传的 result.txt 输出结果。
作者: winbat 时间: 2016-10-1 12:47
回复 23# pcl_test
好的,谢谢 @pcl_test 老大 国庆节快乐!
作者: aa77dd@163.com 时间: 2016-10-1 13:28
本帖最后由 aa77dd@163.com 于 2016-10-1 14:04 编辑
回复 22# winbat
我测试是所有文件都在同一目录
好吧 我知道楼主是一点批处理也不会了 只用在 截取号码段.txt 前加上目录 tmp\ 就行了
仍有疑问, 下载完整测试包
http://pan.baidu.com/s/1gfr1Kyv- @echo off & setlocal enabledelayedexpansion
-
- >result.txt cd.
-
- for /f "tokens=1,2 delims=-" %%a in (tmp\截取号码段.txt) do (
-
- set "a=%%a" & set "b=%%b" & set "name=!a:~0,4!"
-
- for /f tokens^=2delims^=: %%i in ('find /c /v "" "!name!.txt"') do set /a "lb=0, ub=%%i, sk=ub/2"
- call :PAfterLines "!name!.txt" "!a:~0,13!" 0
-
- call :writeTemp "!name!.txt" tmpfile new
- sort /r tmpfile /o tmpfile
-
- for /f tokens^=2delims^=: %%i in ('find /c /v "" tmpfile') do set /a "lb=0, ub=%%i, sk=ub/2"
- call :PAfterLines tmpfile "!b:~0,13!" -1
- call :writeTemp tmpfile result.txt
- )
- sort result.txt /o result.txt
- del tmpfile
- fc result.txt 期待结果.txt
- pause
- exit
-
-
- :writeTemp infile outfile new
- if "%3" neq "" >"%~2" cd.
- if !sk! equ 0 (copy "%~2" + "%~1" "%~2" & exit /b)
- >>"%~2" (for /f skip^=%sk% %%a in (%~s1) do echo;%%a)
- exit /b
-
-
- REM order = 0 升序 order = -1 反序
- :PAfterLines file str order
- if !sk! equ 0 exit /b
- for /f skip^=%sk% %%a in (%~1) do (
- if !lb! geq !ub! exit /b
- if "%%a" gtr "%~2" (
- set /a "ub=(~%3 & sk)|(%3 & ub), lb=(~%3 & lb)| (%3 & (sk+^!(lb-sk))), sk=(lb+ub)>>1"
- call :PAfterLines %~1 %~2 %3 & exit /b
- ) else if "%%a" equ "%~2" ( exit /b
- ) else (
- set /a "lb=(~%3 & (sk+^!(lb-sk)))|(%3 & lb), ub=(~%3 & ub)|(%3 & sk), sk=(lb+ub)>>1"
- call :PAfterLines %~1 %~2 %3 & exit /b
- )
- )
- exit /b
复制代码
作者: codegay 时间: 2016-10-1 21:09
这些是号码是条形码?
还是门店之类编码?
作者: winbat 时间: 2016-10-4 16:01
回复 27# codegay
嗯,是条形码
作者: winbat 时间: 2016-10-4 16:08
回复 26# aa77dd@163.com
谢谢,@aa77dd@163.com 代码测试通过,手工试了另一批产品结果 号码段及数量 都对,非常感谢 @aa77dd@163.com @pcl_test @codegay 及热帮助的坛友们。
这里是个很能让人学习到东西的地方,期望坛子越来越好!最后祝大家国庆快乐!
作者: WHY 时间: 2016-10-6 19:26
回复 29# winbat
楼主你当真在这个论坛学东西了吗?
作者: WHY 时间: 2016-10-6 19:29
- @echo off & setlocal enabledelayedexpansion
- copy /b *.txt a.Log
- for /f "tokens=1,2delims=-" %%i in (tmp\截取号码段.txt) do (
- set /a n+=1
- set _%%i_!n!=1&set _%%j.!n!=1
- )
-
- set n=1
- (for /f "delims=" %%i in ('sort a.Log') do (
- if defined _%%i_!n! set flag=1
- if defined flag echo;%%i
- if defined _%%i.!n! (set /a n+=1 & set flag=)
- ))>result.Log
- pause
复制代码
作者: winbat 时间: 2016-12-1 16:19
回复 31# WHY
代码运行结果 copy 合并,没达到效果。但还是要谢谢 @WHY 兄 ,问题已解决了。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |