找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 16952|回复: 7

【已解决】50元求助批处理根据文件名统计数量

  [复制链接]
发表于 2019-5-19 11:10:09 | 显示全部楼层 |阅读模式
本帖最后由 sysclock 于 2019-5-22 14:00 编辑

有一些文件,通过dir命令已经得到文件名,要进一步处理
===文件名=====
20190511152311.032357965-CP14.dat
20190511152313.030170535-CP14.dat
20190511152315.030184055-CP14.dat
20190511152317.030193560-CP14.dat
20190511152319.030201595-CP14.dat
20190511152321.030213575-CP14.dat
20190511152323.030224565-CP14.dat
20190511152325.030236580-CP14.dat
20190511152327.030251605-CP14.dat
20190511152329.030265035-CP14.dat
20190511152331.030282525-CP14.dat
20190511152333.030282450-CP14.dat
20190511152335.030294475-CP14.dat
20190511152337.030309415-CP14.dat

上述名字的格式:如“20190511152337.030309415-CP14”  是年4位-月2位-日2位-时2位-分2位-秒2位.ms3位-us3位-ns3位 - 站点名字符若干-站点序号2位
要处理的事:
1、统计文件的数量;
2、统计所有文件中ns的分布:000-099内多少个;100-199内多少个,---;能再统计us分布更好
us分布                  ms 次数              us 次数                      ns 次数
----------------------------------------------------------------------------------
000-099                    53
100-199                    22
.........

3、如果小数点后面的年月日时分秒相同的文件,这些文件的站点序号(.dat的前2个数字不同)不同,统计不同的站点序号,在不容的时刻相差多少

支付宝50元有人愿意帮忙吗?后面还有类似的事情请求帮忙。
谢谢。
  1. dir /b *.dat > 1.txt

  2. ::get ms-us-ns value
  3. ::for /f "delims=. tokens=2" %%i in (1.txt)        do (echo %%i)
  4. for /f "delims=. tokens=2" %%i in (1.txt)        do (
  5.         echo %%i >>2.txt
  6.         )

  7. ::discard -StationName-StationNumber
  8. for /f "delims=- tokens=1" %%i in (2.txt)        do (
  9.         echo %%%i >>3.txt
  10.         )

  11. ::这一步总是出错。
  12. for /f "delims=- tokens=1 %%i in (3.txt)        do (
  13.         set        str=%%i
  14.         set        var=%str:~7,9%
  15.         echo %var% >>4.txt
  16.         )
复制代码
发表于 2019-5-19 11:46:31 | 显示全部楼层
第3点什么意思啊,读不顺呀
 楼主| 发表于 2019-5-19 12:01:10 | 显示全部楼层
本帖最后由 sysclock 于 2019-5-19 12:03 编辑

谢谢版主~

3、如果小数点后面的年月日时分秒相同的文件,这些文件的站点序号(.dat的前2个数字不同)不同,统计不同的站点序号,在不同的时刻相差的ns数是多少

实际中,采集的文件是这样的
20190511152335.030294475-CP14.dat
20190511152337.030309415-CP14.dat

20190511152335.030294435-CP15.dat
20190511152337.030309455-CP15.dat

20190511152335.030294495-CP16.dat
20190511152337.030309435-CP16.dat
.......

可以看到,20190511152335这一秒,有三个站点生成了文件,产生如下一个比较输出是最好(diff是所有不同的台站的同一时刻的最大值-最小值):
TIME                              CP14                                    CP15                          CP16          diff
-----------------------------------------------------------------------------------------------------------------
20190511152335        475                                 435                               495               60
20190511152337        415                                 455                                435              40
......

如果某个时刻,某个站点没有数据,用×表示;
发表于 2019-5-19 13:11:49 | 显示全部楼层
本帖最后由 zaqmlp 于 2019-5-19 19:38 编辑
  1. @echo off
  2. mode con lines=1000
  3. set info=互助互利,支付宝扫码头像,感谢赞助
  4. rem 有问题,可加QQ956535081及时沟通
  5. title %info%
  6. cd /d "%~dp0"
  7. powershell -NoProfile -ExecutionPolicy bypass ^
  8.     $list=New-Object 'System.Collections.Generic.Dictionary[string,Object]';^
  9.     for($i=0;$i -le 9;$i++){$list.Add((''+$i+'00-'+$i+'99'),@(0,0,0))};^
  10.     $c=0;$dic=New-Object 'System.Collections.Generic.Dictionary[string,Object]';^
  11.     $files=@(dir^|?{$_ -is [System.IO.FileInfo]});^
  12.     for($i=0;$i -lt $files.Count;$i++){^
  13.         $m=[regex]::match($files[$i].Name,'^^(\d{14})\.(\d{3})(\d{3})(\d{3})-(.+?\d{2})\.dat');^
  14.         if($m.success){^
  15.             foreach($it in $list.keys){^
  16.                 $t=$it.split('-');^
  17.                 for($j=0;$j -le 2;$j++){^
  18.                     if(([int]$m.groups[$j+2].value -ge [int]$t[0]) -and ([int]$m.groups[$j+2].value -le [int]$t[1])){^
  19.                         $list[$it][$j]++;^
  20.                     };^
  21.                 };^
  22.             };^
  23.             $item=$m.groups[5].value+':'+$m.groups[4].value;^
  24.             if(-not $dic.ContainsKey($m.groups[1].value)){^
  25.                 [System.Collections.ArrayList]$s=@($item);^
  26.                 $dic.Add($m.groups[1].value, $s);^
  27.             }else{^
  28.                 [void]$dic[$m.groups[1].value].Add($item);^
  29.             };^
  30.             $c++;^
  31.         };^
  32.     };^
  33.     $result=''+$c+"`r`n-----------------------`r`n";^
  34.     foreach($it in $list.Keys){$result+=$it+"`t"+($list[$it] -join ',')+"`r`n";};^
  35.     $result+="-----------------------`r`n";^
  36.     foreach($it in $dic.Keys){^
  37.         $arr=@($dic[$it]^|sort {[int]$_.split(':')[1]});^
  38.         $result+=$it+"`t"+($arr -join ',')+"`t"+([int]$arr[-1].split(':')[1]-[int]$arr[0].split(':')[1])+"`r`n";^
  39.     };^
  40.     $result;[IO.File]::WriteAllText('$result.log', $result, [Text.Encoding]::Default);^
  41.     write-host '%info%' -ForegroundColor green;
  42. pause
复制代码
 楼主| 发表于 2019-5-19 14:59:12 | 显示全部楼层
佩服佩服~
谢谢!

回复 4# zaqmlp
发表于 2019-5-19 19:03:26 | 显示全部楼层
纯批处理版
以题干所列文件名为样本测试

  1. 20190511152311.032357965-CP14.dat
  2. 20190511152313.030170535-CP14.dat
  3. 20190511152315.030184055-CP14.dat
  4. 20190511152317.030193560-CP14.dat
  5. 20190511152319.030201595-CP14.dat
  6. 20190511152321.030213575-CP14.dat
  7. 20190511152323.030224565-CP14.dat
  8. 20190511152325.030236580-CP14.dat
  9. 20190511152327.030251605-CP14.dat
  10. 20190511152329.030265035-CP14.dat
  11. 20190511152331.030282525-CP14.dat
  12. 20190511152333.030282450-CP14.dat
  13. 20190511152335.030294435-CP15.dat
  14. 20190511152335.030294475-CP14.dat
  15. 20190511152335.030294495-CP16.dat
  16. 20190511152337.030309415-CP14.dat
  17. 20190511152337.030309435-CP16.dat
  18. 20190511152337.030309455-CP15.dat
复制代码
  1. @echo off
  2. setlocal enabledelayedexpansion

  3. set "nFileCount=0"

  4. REM =====统计文件总数
  5. echo,Step 1 :
  6. for /f "tokens=*" %%i in ('dir /b *.dat') do (
  7.         set /a "nFileCount+=1"
  8. )
  9. echo,统计文件总数为 : !nFileCount!
  10. echo,&echo,

  11. REM =====统计毫秒、微秒、纳秒数量级分布规律
  12. echo,Step 2 :
  13. call :_ShowTimeCount
  14. REM 显示统计结果
  15. echo,LEVEL    ms次数    us次数    ns次数
  16. echo,------------------------------------
  17. for /l %%i in (0 1 9) do (
  18.         echo,%%i00-%%i99  !nMS%%i00%%i99!    !nUS%%i00%%i99!    !nNS%%i00%%i99!
  19. )
  20. echo,&echo,

  21. REM =====显示同一时刻不同网站纳秒差
  22. echo,Step 3 :
  23. for /l %%i in (1 1 !nMainCount!) do (
  24.         call :_ShowTimeDiff %%i
  25. )

  26. pause
  27. goto :EOF

  28. :_ShowTimeCount
  29. (
  30.         REM 变量初始化
  31.         for /l %%i in (0 1 9) do (
  32.                 set "nMS%%i00%%i99=0"
  33.                 set "nUS%%i00%%i99=0"
  34.                 set "nNS%%i00%%i99=0"
  35.         )

  36.         REM for /l %%i in (0 1 9) do (
  37.         REM         echo,nMS%%i00%%i99=!nMS%%i00%%i99!
  38.         REM         echo,nUS%%i00%%i99=!nUS%%i00%%i99!
  39.         REM         echo,nNS%%i00%%i99=!nNS%%i00%%i99!
  40.         REM )
  41.        
  42.         REM 定义查询字典
  43.         set "strDict="
  44.         REM 统计总时刻数
  45.         set "nMainCount=0"
  46.         for /f "tokens=1,2,3 delims=.-" %%i in ('dir /b *.dat') do (
  47.                 REM echo,当前处理信息为   : %%i.%%j-%%k.dat
  48.                 set "strMain=%%i"
  49.                 set "strS=%%j"

  50.                 set "nMS=!strS:~0,3!"
  51.                 REM echo,当前毫秒值为     : !nMS!
  52.                 for /l %%a in (0 1 9) do (
  53.                         if "!nMS:~0,1!" EQU "%%a" (
  54.                                 set /a "nMS%%a00%%a99+=1"
  55.                         )
  56.                 )

  57.                 set "nUS=!strS:~3,3!"
  58.                 REM echo,当前微秒值为     : !nUS!
  59.                 for /l %%a in (0 1 9) do (
  60.                         if "!nUS:~0,1!" EQU "%%a" (
  61.                                 set /a "nUS%%a00%%a99+=1"
  62.                         )
  63.                 )

  64.                 set "nNS=!strS:~6!"
  65.                 REM echo,当前纳秒值为     : !nNS!
  66.                 for /l %%a in (0 1 9) do (
  67.                         if "!nNS:~0,1!" EQU "%%a" (
  68.                                 set /a "nNS%%a00%%a99+=1"
  69.                         )
  70.                 )

  71.                 REM 对同一秒内不同站点的纳秒值差进行统计
  72.                 REM echo,当前字典 : !strDict!
  73.                 echo,!strDict! | findstr "!strMain!" >nul 2>nul && (
  74.                         REM 有此时刻统计信息,更新网站数
  75.                         set /a "n!strMain!Count+=1"
  76.                 ) || (
  77.                         REM 无此时刻统计信息
  78.                         REM 更新时刻总数
  79.                         set /a "nMainCount+=1"
  80.                         REM 当前新时刻计数初始化
  81.                         set "n!strMain!Count=1"
  82.                         REM 更新字典
  83.                         set "strDict=!strDict!(!strMain!)"
  84.                 )
  85.                 REM 更新MAP
  86.                 call set "str!strMain!.%%n!strMain!Count%%.Name=%%k"
  87.                 call set "str!strMain!.%%n!strMain!Count%%.NS=!nNS!"
  88.                 REM echo,当前总时刻数 : nMainCount = !nMainCount!
  89.                 REM call echo,当前时刻总数 : n!strMain!Count = %%n!strMain!Count%%
  90.                 REM call call echo,当前分析站点 : str!strMain!.%%n!strMain!Count%%.Name = %%%%str!strMain!.%%n!strMain!Count%%.Name%%%%
  91.                 REM call call echo,当前分析纳秒 : str!strMain!.%%n!strMain!Count%%.NS = %%%%str!strMain!.%%n!strMain!Count%%.NS%%%%
  92.         )
  93.         for /l %%i in (0 1 9) do (
  94.                 set "nMS%%i00%%i99=000000!nMS%%i00%%i99!"
  95.                 set "nMS%%i00%%i99=!nMS%%i00%%i99:~-6!"
  96.                 set "nUS%%i00%%i99=000000!nUS%%i00%%i99!"
  97.                 set "nUS%%i00%%i99=!nUS%%i00%%i99:~-6!"
  98.                 set "nNS%%i00%%i99=000000!nNS%%i00%%i99!"
  99.                 set "nNS%%i00%%i99=!nNS%%i00%%i99:~-6!"
  100.         )
  101.         goto :EOF
  102. )

  103. :_ShowTimeDiff
  104. (
  105.         for /f "tokens=%1 delims=()" %%a in ('echo,!strDict!') do (
  106.                 REM echo,当前处理时刻 %%a
  107.                 set "strTime=%%a"
  108.                 set "nTmpCount=0"
  109.                 call set "nTmpCount=%%n!strTime!Count%%"
  110.                 REM echo,共有网站记录数 : !nTmpCount!
  111.                 set /a "nMin=999"
  112.                 set /a "nMax=0"
  113.                 set /p=!strTime!    <nul
  114.                 for /l %%i in (1 1 !nTmpCount!) do (
  115.                         REM echo,第 %%i 个网站 :
  116.                         call set "strTmpName=%%str!strTime!.%%i.Name%%"
  117.                         REM echo,Name : !strTmpName!
  118.                         call set "strTmpNS=%%str!strTime!.%%i.NS%%"
  119.                         REM call echo,NS   : !strTmpNS!
  120.                         set /p=!strTmpName!:!strTmpNS!    <nul
  121.                         if !nMin! GEQ !strTmpNS! set "nMin=!strTmpNS!"
  122.                         if !nMax! LEQ !strTmpNS! set "nMax=!strTmpNS!"
  123.                 )
  124.                 set /a "nDiff=!nMax!-!nMin!"
  125.                 echo,Diff:!nDiff!
  126.         )
  127.         goto :EOF
  128. )

复制代码
 楼主| 发表于 2019-5-19 22:11:40 | 显示全部楼层
本帖最后由 sysclock 于 2019-5-21 21:39 编辑

已经结题.高手中更有高手,请amwfjhh兄弟留个支付宝号码,一包香烟,略表谢意,谢谢大家
发表于 2019-5-20 15:20:50 | 显示全部楼层
本帖最后由 WHY 于 2019-5-21 09:24 编辑
  1. @if(0)==(0) echo off
  2. dir /b *.dat | cscript //nologo //e:jscript "%~f0" > Result.Log
  3. pause & goto :EOF
  4. @end

  5. var ms = [], us = [], ns = [];
  6. for(var i=0; i<=9; i++){ ms[i] = 0; us[i] = 0; ns[i] = 0; }
  7. var total = 0;
  8. var map = [];

  9. while(!WSH.StdIn.AtEndOfStream) {
  10.     var f = WSH.StdIn.ReadLine();
  11.     var m = f.match(/^(\d{14})\.(\d)\d\d(\d)\d\d(\d)(\d\d)-(.+)\.dat$/i);
  12.     if(!m) continue;
  13.     total++;
  14.     ms[1*m[2]]++;
  15.     us[1*m[3]]++;
  16.     ns[1*m[4]]++;
  17.     if(!map[m[1]]) map[m[1]] = [];
  18.     map[m[1]].push( [m[6], m[4] + m[5]] );
  19. }

  20. WSH.Echo('文件总数:' + total + '\r\n\r\n范围\tms次数\tus次数\tns次数');
  21. for(var i=0; i<=9; i++){
  22.     WSH.Echo(i + '00-' + i + '99\t' + ms[i] + '\t' + us[i] + '\t' + ns[i]);
  23. }

  24. WSH.Echo('');
  25. for(var key in map) {
  26.     var Len = map[key].length;
  27.     if(Len <= 1) continue;
  28.     var arr = map[key].sort(function(a,b){return a[1]-b[1]});
  29.     var min = arr[0][1];
  30.     var max = arr[Len-1][1];
  31.     WSH.Echo(key + '\t' + arr.join('\t') + '\tdiff,' + (max-min));
  32. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 05:26 , Processed in 0.012077 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表