Board logo

标题: [文本处理] 如何将文本里每行前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

投机取巧点,会不会崩了就不知道了。
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in ('sort aa.txt') do (
  3.       set "tmp=!str!"
  4.       set "str=%%a"
  5.       if not "!tmp!"=="" (
  6.         if not "!tmp:~,11!"=="!str:~,11!" echo,!tmp:~,11!-1!tmp:~11!
  7.       )
  8. )
  9.   echo,!str:~,11!-1!str:~11!
  10. )>bb.txt
  11. (for /f "tokens=1,2 delims=-" %%a in (bb.txt) do (
  12.     set/a n=%%b+2000
  13.     if !n! geq 19999900 set n=19999900
  14.     for /l %%l in (10000100,100,!n!) do (
  15.        set "str=%%l"
  16.        echo,%%a!str:~-7!
  17.     )
  18. ))>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

外部命令+第三方,爽爽的:
  1. @echo off
  2. (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
  3. 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 编辑
  1. rem win7及以上系统运行
  2. 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)};''}"
  3. pause&exit
  4. BGEAL0801010000100
  5. BGEAL0801010003100
  6. BGEAL0903120000200
  7. BGEAL0903120007100
  8. BGEAL0809270031200
  9. BHSUC1301310000100
  10. BTSAC1010200000300
  11. BTSAC1212270000500
复制代码





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