标题: [文本处理] 如何将文本里每行前11位字符相同的行进行分组并找出每组中后7位数字最小和最大的值 [打印本页]
作者: necnec1 时间: 2013-7-12 11:38 标题: 如何将文本里每行前11位字符相同的行进行分组并找出每组中后7位数字最小和最大的值
本帖最后由 pcl_test 于 2016-11-12 12:21 编辑
一个文本文件AA.TXT 大概400万行 如下
BGEAL0801010000100
BGEAL0801010003100
BGEAL0903120000200
BGEAL0903120007100
BGEAL0809270031200
BHSUC1301310000100
BTSAC1010200000300
BTSAC1212270000500
前五位是大写的英文字母 接下来的6位是年月日 最后的7位是数字编号 以100位单位 极限值可以到9999900
我要的结果是
BGEAL 08年1月1日 这组有2个 最大的是3100 后面加上2000 最后的结果为BGEAL0801010005100
BGEAL 09年3月12日 这组有2个 最大的是7100 后面加上2000 最后的结果是BGEAL0903120009100
BGEAL 08年9月27日 这组有1个 最大的是31200 后面加上2000 最后的结果是BGEAL0809270033200
BHSUC 13年1月31日 这组1个 最大的是100 后面加上2000 最后的结果是BHSUC1301310002100
后面的依次类推
结果保存在BB.TXT
然后把BB.TXT里生成的结果批量生成 例如
BGEAL0801010000100 BGEAL0801010000200 BGEAL0801010000300 这样 一直批量生成到 BGEAL0801010005100 就OK了
结果肯定超过400万行 不知道批处理的速度怎么样
还有一个 今天是13年7月 日期最好能在批处理里自己调 以后的月份也是要用到的
请会的朋友帮忙 谢谢~
作者: terse 时间: 2013-7-12 13:52
有些地方 暂没看懂
什么叫2组 是不是第一组100递增到9999900 第二组100递增到5100
对比这个贴的变化是 什么 http://bbs.bathome.net/viewthrea ... mp;page=1#pid133998
作者: necnec1 时间: 2013-7-12 14:15
本帖最后由 necnec1 于 2013-7-12 14:17 编辑
回复 2# terse
回楼主 跟那个性质是类似的 只是这个 我的文本AA.TXT已经有最大的数值出现 只要在最大的数值基础上加2000 就行了
下面一步 就是你写的那个批处理来 按100的数值往上翻 这次不是60万了 到最大的数值基础上加2000
作者: xxpinqz 时间: 2013-7-12 14:24
投机取巧点,会不会崩了就不知道了。- @echo off&setlocal enabledelayedexpansion
- (for /f "delims=" %%a in ('sort aa.txt') do (
- set "tmp=!str!"
- set "str=%%a"
- if not "!tmp!"=="" (
- if not "!tmp:~,11!"=="!str:~,11!" echo,!tmp:~,11!-1!tmp:~11!
- )
- )
- echo,!str:~,11!-1!str:~11!
- )>bb.txt
- (for /f "tokens=1,2 delims=-" %%a in (bb.txt) do (
- set/a n=%%b+2000
- if !n! geq 19999900 set n=19999900
- for /l %%l in (10000100,100,!n!) do (
- set "str=%%l"
- echo,%%a!str:~-7!
- )
- ))>ok.txt
复制代码
作者: PowerShell 时间: 2013-7-12 15:17
实际上这类数据处理,用excel+点几下鼠标是很简单地。最重要的是逻辑。
第一列是这个,BGEAL0801010000100
第二列是这个,BGEAL080101
第三列是这个,0000100
然后点排序,然后第四列增加
第五列是组合。
作者: DAIC 时间: 2013-7-12 15:21
回复 5# PowerShell
这个用PowerShell如何实现呢?求代码,求学习。
作者: CrLf 时间: 2013-7-12 16:12
外部命令+第三方,爽爽的:- @echo off
- (sort|gawk "{qz=(substr($0,0,12));num=(substr($0,13,7));ar[qz]=(1 num) - 1000000}END{for(a in ar){for(i=0;i<=ar[a];i+=100)printf(\"%%s%%06d\n\",a,i)}}") <a.txt>b.txt
- pause
复制代码
作者: terse 时间: 2013-7-13 17:52
本帖最后由 terse 于 2013-7-13 18:13 编辑
回复 7# CrLf
(substr($0,13,7) 这里是否这样啊 (substr($0,12,7) 当然取6位就不考虑了
楼主应否要加上2000 num = substr($0,12,7) + 2000
作者: pcl_test 时间: 2016-11-12 12:19
本帖最后由 pcl_test 于 2016-11-12 12:28 编辑
- rem win7及以上系统运行
- more +3 "%~f0"|powershell -c "$input|sort|gu|group {$_.Substring(0,11)}|%%{$min=$max=0;$t=@($_.group|%%{$_});$min=1*$t[0].Substring($t[0].length-7);$max=2000+$t[-1].Substring($t[-1].length-7);for($i=$min;$i -le $max;$i+=100){$_.Name+('{0:d7}' -f $i)};''}"
- pause&exit
- BGEAL0801010000100
- BGEAL0801010003100
- BGEAL0903120000200
- BGEAL0903120007100
- BGEAL0809270031200
- BHSUC1301310000100
- BTSAC1010200000300
- BTSAC1212270000500
复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |