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

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

本帖最后由 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
...

有点难受实在写不出来了,抱歉,看看下午感冒能不能好一点。。话说如果一行有多个13的数字怎么处理,取哪个

TOP

本帖最后由 mxarky 于 2012-8-25 10:45 编辑

回复 2# canyuexiaolang


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

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

字符串之间应该都有个空格,如果以空格为标识符换行的话,然后过滤空行,直到每行有个字符串(长度包括13位的),然后再取每行长度为13位数字的字符串。。。
不知道这样可行不?

TOP

  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

评分人数

    • mxarky: 数据不多时测试通过,牛!技术 + 1
求老大赐我《精通正则表达式》

TOP

回复 4# 乱码


谢谢乱码!  测试一部分数据通过,没想到JS也不错!
js代码知识不太了解,能否麻烦乱码注释下代码意思,谢谢!

TOP

回复 5# mxarky
如果数据量大,就用readline了,我的电脑测试,46MB的文本,4秒左右,这个快慢主要取决于cpu的性能、
求老大赐我《精通正则表达式》

TOP

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

不知道这个可有难度?

TOP

本帖最后由 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

评分人数

    • mxarky: 还差一点点,输出就和结果为指定数据的数据 ...技术 + 1

TOP

回复 8# canyuexiaolang

谢谢canyuexiaolang版主
还有一步。
输出求和后结果指为52,39,...的数据
输出结果为:
8315012734675
4415012735016
....

TOP

回复 9# mxarky


   这个是什么。。抱歉没理解。。

TOP

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

TOP

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

评分人数

    • mxarky: 测试了一些数据通过技术 + 1

TOP

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

评分人数

求老大赐我《精通正则表达式》

TOP

回复 12# canyuexiaolang


谢谢canyuexiaolang版主,先用乱码的JS代码处理完后,再用批处理可以达到效果,不知道第一步能不能用批处理完成。。。

TOP

回复 13# 乱码


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

TOP

返回列表