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

[文本处理] 批处理如何从文本文件中提取13位数字

[复制链接]
发表于 2012-8-25 10:19:25 | 显示全部楼层 |阅读模式
本帖最后由 mxarky 于 2012-8-25 10:25 编辑

请各位看看这个这个问题可有解决方法,谢谢!
批处理如何从文本文件中提取13位数字

有文本文件123.txt
特点:
1、文本中字符串之间存在空格,某行可能是空行或者全是空格
2 、一行中如果存在13位数字串的话,13位数字串是连续的且全都是数字
内容为:(红色为解释当前行可能出现的情况)

4510127348023                                                  ; 此行只有一个13位数字,23后是回车
9550127347566                                                  ; 此行只有一个13位数字,且66后有一个或若干个空格
       8315012734675                                           ; 此行只有一个13位数字,75后是回车
    4415012735016                                              ; 此行只有一个13位数字,44前有一个或若干个空格且16后有一个或若干个空格
1036523711870   6136523321071                       ; 此行有若干个13位数字,13位数字间有一个或若干个空格
7136452371096   1036523132375                       ; 此行有若干个13位数字,13位数字间有一个或若干个空格,最后一个13位数后有一个或若干个空格
        1036523711870   6136523321071               ; 此行有若干个13位数字,13位数字间有一个或若干个空格,第一个13位数前有一个或若干个空格
  7136452371096   4566523133751                     ; 此行有若干个13位数字,13位数字间有一个或若干个空格,第一个13位数前有一个或若干个空格,75后有一个或若干个空格
1743670260443 16 50  2367026040324 92 56      ; 此行有若干个13位数字,13位数字间有一个或若干个空格,或有若干个小于13位数字串组成
2343670260425 96 50  1563670273270  2356      ; 此行有若干个13位数字,13位数字间有一个或若干个空格,或有若干个小于13位数字串组成,2356后有一个或若干个空格   
aaa dd  钢铁                                                        ; 此行没有13位数字
钢铁                                                                   ; 此行没有13位数字
12 02a   2013652313375    钢铁                           ; 此行有一个或若干个13位数字
8883652371187   5513652385302  126件             ; 此行有一个或若干个13位数字,126件后是回车
4413652363217   8313652381977 64件 122138元 ; 此行有一个或若干个13位数字,122138元后有一个或若干个空格
                                                                         ; 此行有若干个空格
9993652381950 64件 138件  1003652315263 64件 138件 ; 此行有一个或若干个13位数字,138件后是回车
                                                                          ; 此行是空行
22-1-232-1                                                         ; 此行没有13位数字
0313670251844 57件 130件 1961170260434 91 70  ; 此行有一个或若干个13位数字



运行批处理后得到结果后储存以b.txt中,一个13位数为一行
结果为:

4510127348023
9550127347566
8315012734675
4415012735016
1036523711870
6136523321071
7136452371096
1036523132375
...
发表于 2012-8-25 10:34:26 | 显示全部楼层
有点难受实在写不出来了,抱歉,看看下午感冒能不能好一点。。话说如果一行有多个13的数字怎么处理,取哪个
 楼主| 发表于 2012-8-25 10:42:03 | 显示全部楼层
本帖最后由 mxarky 于 2012-8-25 10:45 编辑

回复 2# canyuexiaolang


    只要是13位数字都要,但前提这个数字串必须是连续的13位数字

思路知道就是不知道写。。。

字符串之间应该都有个空格,如果以空格为标识符换行的话,然后过滤空行,直到每行有个字符串(长度包括13位的),然后再取每行长度为13位数字的字符串。。。
不知道这样可行不?
发表于 2012-8-25 10:43:25 | 显示全部楼层
  1. file = "要处理的文件.txt"
  2. var fso = new ActiveXObject("scripting.filesystemobject");
  3. var str = fso.OpenTextFile(file,1).ReadAll();
  4. fso.OpenTextFile(file+"_ok.txt",2,1).Write(str.match(/\d{13}/gm).join('\r\n'));
  5. WSH.echo('完成');
复制代码
把这个代码保存为 "测试.js" 修改好文件名然后双击就可以了

不知道是不是你想要的效果、

评分

参与人数 1技术 +1 收起 理由
mxarky + 1 数据不多时测试通过,牛!

查看全部评分

 楼主| 发表于 2012-8-25 11:10:56 | 显示全部楼层
回复 4# 乱码


谢谢乱码!  测试一部分数据通过,没想到JS也不错!
js代码知识不太了解,能否麻烦乱码注释下代码意思,谢谢!
发表于 2012-8-25 11:25:04 | 显示全部楼层
回复 5# mxarky
如果数据量大,就用readline了,我的电脑测试,46MB的文本,4秒左右,这个快慢主要取决于cpu的性能、
 楼主| 发表于 2012-8-25 12:12:53 | 显示全部楼层
回复 6# 乱码


还请教乱码一个问题
既然能输出13位数,能否用JS或批处理对每一个输出的13数进行下处理:

1、剔除含9的13位数
2、对剩下的数据进行求和并输出指定结果的数据

例如:对问题中的数据进行处理后输出的13位数为:
4510127348023
9550127347566
8315012734675
4415012735016
1036523711870
6136523321071
7136452371096
1036523132375
1036523711870
.....

1、剔除含9的13位数,输出的结果为
4510127348023
8315012734675
4415012735016
1036523711870
6136523321071
1036523132375
1036523711870
.....

2、对剩下的数据进行求和
4510127348023   那么:4+5+1+0+1+2+7+3+4+8+0+2+3=40
8315012734675   那么:8+3+1+5+0+1+2+7+3+4+6+7+5=52
4415012735016   那么:4+4+1+5+0+1+2+7+3+5+0+1+6=39
1036523711870   那么:1+0+3+6+5+2+3+7+1+1+8+7+0=44
...

输出求和后结果指为52,39,...的数据
输出结果为:
8315012734675
4415012735016
....

如果能输出到Excel更好,例如:
8315012734675    52
4415012735016    39
....

不知道这个可有难度?
发表于 2012-8-25 12:16:47 | 显示全部楼层
本帖最后由 canyuexiaolang 于 2012-8-25 12:25 编辑

回复 7# mxarky


这个完全无压力啊。批处理即可。输入到excel也可以。

文本为1.txt的话

  1. @echo off & setlocal enabledelayedexpansion
  2. (for /f "tokens=* delims=" %%i in ('findstr /v "9" 1.txt') do (
  3.     set "line=%%i"
  4.     for /l %%a in (0 1 12) do set /a sum=!sum!+!line:~%%a,1!
  5.     echo %%i,!sum!
  6.     set /a sum=0
  7. ))>Result.csv
  8. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
mxarky + 1 还差一点点,输出就和结果为指定数据的数据 ...

查看全部评分

 楼主| 发表于 2012-8-25 12:36:37 | 显示全部楼层
回复 8# canyuexiaolang

谢谢canyuexiaolang版主
还有一步。
输出求和后结果指为52,39,...的数据
输出结果为:
8315012734675
4415012735016
....
发表于 2012-8-25 13:02:37 | 显示全部楼层
回复 9# mxarky


   这个是什么。。抱歉没理解。。
 楼主| 发表于 2012-8-25 13:15:42 | 显示全部楼层
回复 10# canyuexiaolang


意思是过滤完数字为9的13位数后,输出剩下的数据串求和的大小为指定的大小的数据。

1、剔除含9的13位数,输出的结果为
4510127348023
8315012734675
4415012735016
1036523711870
6136523321071
1036523132375
1036523711870
.....

2、对剩下的数据进行求和
4510127348023   那么:4+5+1+0+1+2+7+3+4+8+0+2+3=40
8315012734675   那么:8+3+1+5+0+1+2+7+3+4+6+7+5=52
4415012735016   那么:4+4+1+5+0+1+2+7+3+5+0+1+6=39
1036523711870   那么:1+0+3+6+5+2+3+7+1+1+8+7+0=44
...

输出求和后结果指为52,39,...的数据(也就是剔除求和结果不是52,39,...)
4510127348023   那么:4+5+1+0+1+2+7+3+4+8+0+2+3=40
8315012734675   那么:8+3+1+5+0+1+2+7+3+4+6+7+5=52
4415012735016   那么:4+4+1+5+0+1+2+7+3+5+0+1+6=39
1036523711870   那么:1+0+3+6+5+2+3+7+1+1+8+7+0=44

输出到Excel结果为:
8315012734675  52
4415012735016  39
....
发表于 2012-8-25 13:27:10 | 显示全部楼层
回复 11# mxarky

  1. @echo off & setlocal enabledelayedexpansion
  2. set "in=52 39"
  3. (for /f "tokens=* delims=" %%i in ('findstr /v "9" 1.txt') do (
  4.     set "line=%%i"
  5.     for /l %%a in (0 1 12) do set /a sum=!sum!+!line:~%%a,1!
  6.     for %%a in (%in%) do if !sum! equ %%a set "add=true"
  7.     if "!add!"=="true" echo %%i,!sum!
  8.     set /a sum=0,add=0
  9. ))>Result.csv
  10. pause
复制代码


貌似这样可以了

评分

参与人数 1技术 +1 收起 理由
mxarky + 1 测试了一些数据通过

查看全部评分

发表于 2012-8-25 14:19:25 | 显示全部楼层
回复 11# mxarky
  1. file = "要处理的文件.txt"
  2. var fso = new ActiveXObject("scripting.filesystemobject");
  3. var str = fso.OpenTextFile(file,1).ReadAll();
  4. var arr = str.match(/[0-8]{13}/gm);
  5. var retstr = '';
  6. for(var i=0;i<arr.length;i++){
  7.     for(var j=0,sum=0;j<13;j++) sum+=arr[i].charAt(j)*1;
  8.     if(sum==52||sum==39) retstr += arr[i] + '  ' + sum + '\r\n';
  9. }
  10. fso.OpenTextFile(file+"_ok.txt",2,1).Write(retstr);
  11. WSH.echo('完成');
复制代码

评分

参与人数 1技术 +1 收起 理由
mxarky + 1 测试可用

查看全部评分

 楼主| 发表于 2012-8-25 15:24:05 | 显示全部楼层
回复 12# canyuexiaolang


谢谢canyuexiaolang版主,先用乱码的JS代码处理完后,再用批处理可以达到效果,不知道第一步能不能用批处理完成。。。
 楼主| 发表于 2012-8-25 15:26:49 | 显示全部楼层
回复 13# 乱码


谢谢乱码强悍的JS代码,一步搞定!
以前只知道批处理,没想到JS也不错呀!
测试一部分数据没问题,数据量大估计也不会有什么问题。
今天没分加了,后期补上.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-19 14:13 , Processed in 0.022351 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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