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

[文本处理] 如何将文本里每行前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月  日期最好能在批处理里自己调 以后的月份也是要用到的
请会的朋友帮忙 谢谢~

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

TOP

本帖最后由 terse 于 2013-7-13 18:13 编辑

回复 7# CrLf
(substr($0,13,7)  这里是否这样啊   (substr($0,12,7)  当然取6位就不考虑了
楼主应否要加上2000 num = substr($0,12,7) + 2000
1

评分人数

    • CrLf: 是的,我弄混了,感谢指正!技术 + 1

TOP

外部命令+第三方,爽爽的:
  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
复制代码

TOP

回复 5# PowerShell


    这个用PowerShell如何实现呢?求代码,求学习。

TOP

实际上这类数据处理,用excel+点几下鼠标是很简单地。最重要的是逻辑。
第一列是这个,BGEAL0801010000100
第二列是这个,BGEAL080101
第三列是这个,0000100
然后点排序,然后第四列增加
第五列是组合。
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

投机取巧点,会不会崩了就不知道了。
  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
复制代码
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

本帖最后由 necnec1 于 2013-7-12 14:17 编辑

回复 2# terse


    回楼主  跟那个性质是类似的  只是这个  我的文本AA.TXT已经有最大的数值出现   只要在最大的数值基础上加2000 就行了
下面一步 就是你写的那个批处理来  按100的数值往上翻  这次不是60万了  到最大的数值基础上加2000

TOP

有些地方 暂没看懂
什么叫2组 是不是第一组100递增到9999900 第二组100递增到5100
对比这个贴的变化是 什么  http://bbs.bathome.net/viewthrea ... mp;page=1#pid133998

TOP

返回列表