Board logo

标题: [文本处理] 批处理如何从文本文件中提取13位数字 [打印本页]

作者: mxarky    时间: 2012-8-25 10:19     标题: 批处理如何从文本文件中提取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
...
作者: canyuexiaolang    时间: 2012-8-25 10:34

有点难受实在写不出来了,抱歉,看看下午感冒能不能好一点。。话说如果一行有多个13的数字怎么处理,取哪个
作者: mxarky    时间: 2012-8-25 10:42

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

回复 2# canyuexiaolang


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

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

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

  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" 修改好文件名然后双击就可以了

不知道是不是你想要的效果、
作者: mxarky    时间: 2012-8-25 11:10

回复 4# 乱码


谢谢乱码!  测试一部分数据通过,没想到JS也不错!
js代码知识不太了解,能否麻烦乱码注释下代码意思,谢谢!
作者: 乱码    时间: 2012-8-25 11:25

回复 5# mxarky
如果数据量大,就用readline了,我的电脑测试,46MB的文本,4秒左右,这个快慢主要取决于cpu的性能、
作者: mxarky    时间: 2012-8-25 12:12

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

不知道这个可有难度?
作者: canyuexiaolang    时间: 2012-8-25 12:16

本帖最后由 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
复制代码

作者: mxarky    时间: 2012-8-25 12:36

回复 8# canyuexiaolang

谢谢canyuexiaolang版主
还有一步。
输出求和后结果指为52,39,...的数据
输出结果为:
8315012734675
4415012735016
....
作者: canyuexiaolang    时间: 2012-8-25 13:02

回复 9# mxarky


   这个是什么。。抱歉没理解。。
作者: mxarky    时间: 2012-8-25 13:15

回复 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
....
作者: canyuexiaolang    时间: 2012-8-25 13:27

回复 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
复制代码


貌似这样可以了
作者: 乱码    时间: 2012-8-25 14:19

回复 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('完成');
复制代码

作者: mxarky    时间: 2012-8-25 15:24

回复 12# canyuexiaolang


谢谢canyuexiaolang版主,先用乱码的JS代码处理完后,再用批处理可以达到效果,不知道第一步能不能用批处理完成。。。
作者: mxarky    时间: 2012-8-25 15:26

回复 13# 乱码


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

  1. @ECHO OFF
  2. FOR /L %%A IN (0 1 8)DO SET _%%A=1
  3. (FOR /F "DELIMS=" %%F IN (123.TXT)DO (
  4.  FOR %%M IN (%%F)DO CALL :CN "%%M"
  5. ))>B.TXT
  6. GOTO :EOF
  7. :CN NUM
  8. SET FLAG=&SET N=
  9. SET "NUM=%~1"
  10. SET "STR=%NUM%FEDCBA9876543210"
  11. SET/aLEN=0x%STR:~15,1%
  12. IF %LEN%==13 (
  13.  FOR /L %%C IN (0 1 12)DO CALL :ISNUM "%%NUM:~%%C,1%%"
  14. )
  15. IF NOT DEFINED FLAG (
  16.  IF "%N%"=="52" ECHO=%NUM% %N%
  17.  IF "%N%"=="39" ECHO=%NUM% %N%
  18. )
  19. GOTO :EOF
  20. :ISNUM NUM
  21. IF DEFINED _%~1 (SET/aN+=%~1)ELSE SET FLAG=1
复制代码

作者: apang    时间: 2012-8-25 20:15

  1. @echo off
  2. (for /f "delims=" %%a in (1.txt) do (
  3.   for %%b in (%%a) do (
  4.     set "str=%%b"
  5.     setlocal enabledelayedexpansion
  6.     if not "!str:~12,1!"=="" if "!str:~13!"=="" set a=$!str!
  7.     if defined a for /l %%c in (0 1 8) do set a=!a:%%c=!
  8.     if "!a!"=="$" (
  9.       for /l %%c in (0 1 12) do set/a sum+=!str:~%%c,1!
  10.       for %%c in (52 39) do if "%%c"=="!sum!" echo,!str! !sum!
  11.     )
  12.     endlocal   
  13.   )
  14. ))>Result.txt
复制代码

作者: terse    时间: 2012-8-26 11:16

  1. @echo off&setlocal enabledelayedexpansion
  2. set _52=i&set _39=i
  3. for /f "delims=" %%i in (123.txt) do (
  4.     for %%j in (%%i) do (
  5.         set str=%%j#
  6.         if "!str:~13!"=="#" for /l %%k in (0 1 8) do set str=!str:%%k=!
  7.         if !str! == # (
  8.            set sum=&set str=%%j&for /l %%k in (0 1 12) do set/a "sum+=!str:~%%k,1!"
  9.            if defined _!sum! echo,%%j !sum!
  10.         )
  11.     )
  12. )
  13. pause
复制代码

作者: poter    时间: 2012-8-27 21:21

兄弟们写得太复杂,我来个简单的
  1. @echo off
  2. setlocal enableDelayedExpansion
  3. for /f "tokens=*" %%i in ('findstr "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-
  4. 9][0-9][0-9]" 123.txt') do (
  5. for %%j in (%%i) do (
  6. set str=%%j&set count1=
  7. if not "!str:~12!"=="" set /a count1+=1
  8. if !str:~12! GEQ 0 set /a count1+=1
  9. if !str:~12! LEQ 9 set /a count1+=1
  10. if !count1!==3 echo %%j>>new.txt
  11. )
  12. )
复制代码

作者: poter    时间: 2012-8-27 21:37

再来个vbs版的
  1. option explicit
  2. dim class1, class2, class3, class4, str1, str2
  3. set class1 = createobject("scripting.filesystemobject")
  4. set class2 = class1.opentextfile("123.txt")
  5. set class4 = class1.createtextfile("new.txt", 2)
  6. do until class2.atendofstream
  7. str1 = class2.readall
  8. for each str2 in func1(str1)
  9. class4.writeline str2
  10. next
  11. loop
  12. function func1(str)
  13. set class3 = new regexp
  14. class3.pattern = "\d{13}"
  15. class3.global = true
  16. set func1 = class3.execute(str)
  17. end function
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2