标题: [文本处理] 批处理如何从文本文件中提取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
- file = "要处理的文件.txt"
- var fso = new ActiveXObject("scripting.filesystemobject");
- var str = fso.OpenTextFile(file,1).ReadAll();
- fso.OpenTextFile(file+"_ok.txt",2,1).Write(str.match(/\d{13}/gm).join('\r\n'));
- 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的话
- @echo off & setlocal enabledelayedexpansion
- (for /f "tokens=* delims=" %%i in ('findstr /v "9" 1.txt') do (
- set "line=%%i"
- for /l %%a in (0 1 12) do set /a sum=!sum!+!line:~%%a,1!
- echo %%i,!sum!
- set /a sum=0
- ))>Result.csv
- 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
- @echo off & setlocal enabledelayedexpansion
- set "in=52 39"
- (for /f "tokens=* delims=" %%i in ('findstr /v "9" 1.txt') do (
- set "line=%%i"
- for /l %%a in (0 1 12) do set /a sum=!sum!+!line:~%%a,1!
- for %%a in (%in%) do if !sum! equ %%a set "add=true"
- if "!add!"=="true" echo %%i,!sum!
- set /a sum=0,add=0
- ))>Result.csv
- pause
复制代码
貌似这样可以了
作者: 乱码 时间: 2012-8-25 14:19
回复 11# mxarky - file = "要处理的文件.txt"
- var fso = new ActiveXObject("scripting.filesystemobject");
- var str = fso.OpenTextFile(file,1).ReadAll();
- var arr = str.match(/[0-8]{13}/gm);
- var retstr = '';
- for(var i=0;i<arr.length;i++){
- for(var j=0,sum=0;j<13;j++) sum+=arr[i].charAt(j)*1;
- if(sum==52||sum==39) retstr += arr[i] + ' ' + sum + '\r\n';
- }
- fso.OpenTextFile(file+"_ok.txt",2,1).Write(retstr);
- 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
- @ECHO OFF
- FOR /L %%A IN (0 1 8)DO SET _%%A=1
- (FOR /F "DELIMS=" %%F IN (123.TXT)DO (
- FOR %%M IN (%%F)DO CALL :CN "%%M"
- ))>B.TXT
- GOTO :EOF
-
- :CN NUM
- SET FLAG=&SET N=
- SET "NUM=%~1"
- SET "STR=%NUM%FEDCBA9876543210"
- SET/aLEN=0x%STR:~15,1%
- IF %LEN%==13 (
- FOR /L %%C IN (0 1 12)DO CALL :ISNUM "%%NUM:~%%C,1%%"
- )
- IF NOT DEFINED FLAG (
- IF "%N%"=="52" ECHO=%NUM% %N%
- IF "%N%"=="39" ECHO=%NUM% %N%
- )
- GOTO :EOF
-
- :ISNUM NUM
- IF DEFINED _%~1 (SET/aN+=%~1)ELSE SET FLAG=1
复制代码
作者: apang 时间: 2012-8-25 20:15
- @echo off
- (for /f "delims=" %%a in (1.txt) do (
- for %%b in (%%a) do (
- set "str=%%b"
- setlocal enabledelayedexpansion
- if not "!str:~12,1!"=="" if "!str:~13!"=="" set a=$!str!
- if defined a for /l %%c in (0 1 8) do set a=!a:%%c=!
- if "!a!"=="$" (
- for /l %%c in (0 1 12) do set/a sum+=!str:~%%c,1!
- for %%c in (52 39) do if "%%c"=="!sum!" echo,!str! !sum!
- )
- endlocal
- )
- ))>Result.txt
复制代码
作者: terse 时间: 2012-8-26 11:16
- @echo off&setlocal enabledelayedexpansion
- set _52=i&set _39=i
- for /f "delims=" %%i in (123.txt) do (
- for %%j in (%%i) do (
- set str=%%j#
- if "!str:~13!"=="#" for /l %%k in (0 1 8) do set str=!str:%%k=!
- if !str! == # (
- set sum=&set str=%%j&for /l %%k in (0 1 12) do set/a "sum+=!str:~%%k,1!"
- if defined _!sum! echo,%%j !sum!
- )
- )
- )
- pause
复制代码
作者: poter 时间: 2012-8-27 21:21
兄弟们写得太复杂,我来个简单的- @echo off
- setlocal enableDelayedExpansion
- 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-
-
- 9][0-9][0-9]" 123.txt') do (
- for %%j in (%%i) do (
- set str=%%j&set count1=
- if not "!str:~12!"=="" set /a count1+=1
- if !str:~12! GEQ 0 set /a count1+=1
- if !str:~12! LEQ 9 set /a count1+=1
- if !count1!==3 echo %%j>>new.txt
- )
- )
复制代码
作者: poter 时间: 2012-8-27 21:37
再来个vbs版的- option explicit
- dim class1, class2, class3, class4, str1, str2
- set class1 = createobject("scripting.filesystemobject")
- set class2 = class1.opentextfile("123.txt")
- set class4 = class1.createtextfile("new.txt", 2)
- do until class2.atendofstream
- str1 = class2.readall
- for each str2 in func1(str1)
- class4.writeline str2
- next
- loop
-
- function func1(str)
- set class3 = new regexp
- class3.pattern = "\d{13}"
- class3.global = true
- set func1 = class3.execute(str)
- end function
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |