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

80元处理文件,请帮忙 祝大家中秋快乐! 已解决

要求:
把d:se\中所有B开头的文件统计到d:se\se\wltj*.txt,("*"表示任意字符)
处理顺序:以所处理文件的修改时间为先后为序,先处理修改时间在先的文件,每处理一个文件输出一行数据到wltj*.txt,该行数据的各列字符串间由若干空格隔开,只要每列对齐即可,
以文本wltj*.txt的第一行数据(共11列,各列间由空格隔开)为参考行,具体过程如下:
1.1.把处理文件的修改时间放到第1列,单位:年月日时分秒
1.2.所处理文件名称的前4个字符放到第2列;
1.3.根据所处理文件名称的前4个字符,在d:se\se\ipref.txt中找到此字符串,并把所在行的第一个字符串,写入到wltj*.txt的第3列ip*列,若找不到该字符串则写入"-";
1.4.由文件名称的前4个字符,在d:se\se\jhref.txt中存找到此字符串,并把所在行的第一个字符串,写入到wltj*.txt的第4列jh*列,若找不到该字符串则写入"-";
1.5.把所处理文件中含有参考行第5-第10列的字符串的数量写入到wltj*.txt的对应列(第5-第10列),没有该字符串的写入0
1.6.把wltj*.txt的第6~10列值的和写入到本行第11列;
1.7.删除处理过的文件;
暂停100s从头处理周而复始

相关文件见附件。

回复 14# zrf0123


    好的,已回复。

TOP

回复 12# zrf0123


    这边测试没有问题啊。。。我是WIN7 X64 系统

TOP

回复  terse
运行结果多处不可哦。
zrf0123 发表于 2019-9-12 22:17

多处不可是什么情况
实际数据和给出的格式有出入吗

TOP

WHY 发表于 2019-9-10 14:39

基本可以,请回复下短消息内容,谢谢!

TOP

回复 10# terse
运行结果多处不可哦。

TOP

回复 5# 再世情緣

提示“命令语法不正确”,无法正常运行

TOP

做做样子,
  1. use utf8;
  2. use Encode;
  3. use Modern::Perl;
  4. use File::Slurp;
  5. use Date::Format;
  6. use List::Util qw/sum/;
  7. STDOUT->autoflush(1);
  8. my $jhref = load_hash( "./se/jhref.txt" );
  9. my $ipref = load_hash( "./se/ipref.txt" );
  10. my @items = load_item( "./se/wltj201906.txt" );
  11. for my $f ( sort { (stat($a))[9] <=> (stat($b))[9] } glob "*.txt" )
  12. {
  13.     next unless $f =~ /(\w+)\s+(\d+)/;
  14.     my $id = $1;
  15.     my $text = read_file($f);
  16.     my @count = map { $text =~ s/${_}//g } @items;
  17.     printf "%-25s %-9s %-10s %-10s %d %d %d %d %d %d %d\n",
  18.         encode('gbk', time2str( "%Y年%m月%d日%k:%M:%S", (stat($f))[9])),
  19.         $id,
  20.         exists $ipref->{$id} ? $ipref->{$id} : "-",
  21.         exists $jhref->{$id} ? $jhref->{$id} : "-",
  22.         @count,
  23.         sum(@count);
  24. }
  25. sub load_item
  26. {
  27.     my ($head) = read_file( $_[0] );
  28.     my @items = split(/\s+/, $head);
  29.     return grep { s/[\/\*].*// } @items[4..9];
  30. }
  31. sub load_hash
  32. {
  33.     my @lines = read_file( $_[0] );
  34.     my $hash = {};
  35.     for my $e ( grep { /^(j|p)/i } @lines )
  36.     {
  37.         my ($head, @list) = split(/\s+/, $e);
  38.         grep { s/\*//; $hash->{$_} = $head } @list;
  39.     }
  40.     return $hash;
  41. }
复制代码
补充结果:
  1. 2019年06月10日 9:37:44    B096      ping220    jh89       0 5 0 0 0 0 5
  2. 2019年06月10日 9:37:47    B105      ping220    jh90       0 2 0 0 0 0 2
  3. 2019年06月10日 9:37:48    B093      ping220    -          0 7 0 0 0 0 7
  4. 2019年06月10日 9:41:17    B079      ping230    jh89       0 2 0 0 0 0 2
  5. 2019年06月10日 9:41:19    B078      ping221    jh89       0 3 0 0 0 0 3
  6. 2019年06月18日10:54:36    B105      ping220    jh90       0 3 0 0 0 0 3
  7. 2019年06月18日10:54:36    B111      ping230    jh90       0 3 0 0 0 0 3
  8. 2019年06月18日10:54:39    B090      ping1      jh90       0 3 0 0 0 0 3
  9. 2019年06月18日10:54:39    B110      -          jh90       0 2 0 0 0 0 2
  10. 2019年06月19日20:19:59    B254      -          jh0        0 3 0 1 5 0 9
  11. 2019年06月20日19:00:05    B074      ping221    jh89       1 2 0 0 0 0 3
  12. 2019年06月20日19:03:16    B074      ping221    jh89       1 1 0 0 0 0 2
复制代码
错了也不改,逃

TOP

本帖最后由 terse 于 2019-9-11 19:41 编辑

来一个 powershell 的
  1. function Script:Fileinfo{
  2. param([String]$pha,[String]$phb,[String]$f1,[String]$f2)
  3. Begin {
  4.        $array = '修改时间','文件名称','ip','jh','100M','请求','无法','unreach','一般','failure','wl','result'
  5.        $arr =$array[4..9]
  6.        $text = ''
  7. }
  8. process{
  9.      $s1 = $_.LastWriteTime.ToString('yyyy年MM月dd日HH:mm:ss')
  10.      $s2 = ($_.BaseName).Substring(0,4)
  11.      $s3 = (select-string $f1 -pattern "$s2" -AllMatches -Encoding default).Line
  12.      if (!$s3) {$s3 = "-"}
  13.      $s4 = (select-string $f2 -pattern "$s2" -AllMatches -Encoding default).Line
  14.      if (!$s4) {$s4 = "-"}
  15.      $ar = New-Object System.Collections.ArrayList
  16.      for (;$ar.Add(0) -lt 5;){}
  17.      $s = (select-string $_ -pattern $arr -AllMatches  -Encoding default | group Pattern)
  18.      [int] $len = $s.name.Count
  19.      if ($len -gt 0) {
  20.          for ($i = 0;$i -lt $len; $i++) {
  21.              if ($arr  -contains $s[$i].name) {
  22.                   $ar[$arr.indexof($s[$i].name)] += $s[$i].Count
  23.               }
  24.          }
  25.      }
  26.      $sum = ($ar[1..5] | Measure-Object -Sum).Sum
  27.      $ar = ,$s4.split(' ')[0].PadRight(5) + $ar
  28.      $ar = ,$s3.split(' ')[0].PadRight(10) + $ar
  29.      $ar = ,$s2.PadLeft(3) + $ar
  30.      $ar = ,$s1.PadRight(10) + $ar
  31.      $ar += "$sum"
  32.      $text += ($ar -join("`t")) + "`n"
  33. }
  34.     end {
  35.      $f = $phb+'wltj'+ $(-join((48..57 + 65..90 + 97..122) | get-random -count 6 | %{[char]$_}))+'.txt'
  36.      $text | Out-File -Encoding default $f
  37.      Get-ChildItem -Path $pha B*.txt -Force| Sort-Object  -Property LastWriteTime |Where-Object {!$_.PSIsContainer} |remove-item
  38.      }   
  39. }
  40. $pha="d:\se\"
  41. $phb="d:\se\se\"
  42. $f1 = "$phb"+"ipref.txt"
  43. $f2 = "$phb"+"jhref.txt"
  44. Get-ChildItem -Path $pha B*.txt -Force| Sort-Object  -Property LastWriteTime |Where-Object {!$_.PSIsContainer} | Fileinfo "$pha" "$phb" "$f1" "$f2"
复制代码

TOP

回复 7# zrf0123


    从wltj文件读取5-10列修改完了,效率。。。。

TOP

回复 6# zrf0123


    已修改。
如果不需要循环,删除第 57 行、第 6 行、第 3 行。

TOP

回复 5# 再世情緣

wltj*.txt 的第一行参考数据 是变化的,需要提取后使用,主程序中不应出现具体字符串
被统计的文件需立即删除
能高效率执行,直接输出到文本即可,不必加倒计时等
有时间请修改下,谢谢!

TOP

回复 4# WHY
wltj*.txt 的第一行参考数据 是变化的,需要提取后使用,主程序中不应出现具体字符串
被统计的文件需立即删除
请稍作变更,谢谢!

TOP

本帖最后由 再世情緣 于 2019-9-13 00:21 编辑
  1. @echo off &color 0a &setlocal enabledelayedexpansion
  2. mode con cols=140 lines=32
  3. Rem 附件里面是Sec,你发的帖子里是Se,这里你自己斟酌
  4. set "var=D:\se\"
  5. pushd %var%
  6. Rem 下面一行是各列间距,最后一个是等待时间
  7. set /a l1=25,l2=9,l3=9,l4=6,l5=7,l6=8,l7=9,l8=11,l9=10,wts=100
  8. for /f "delims=" %%a in ('dir /b /a -d ".\se\wltj*.txt" 2^>nul') do (set "log=%var%se\%%~nxa")
  9. set /p code=<"!log!"
  10. for /f "tokens=5-10 delims= " %%a in ("!code!") do (set "code=%%a %%b %%c %%d %%e %%f")
  11. for /f "tokens=1,3,5,7,9,11 delims=/ " %%a in ("!code!") do (
  12. set "str=%%a %%b %%c %%d %%e %%f"
  13. set "str1=%%a"
  14. set "str2=%%b"
  15. set "str3=%%c"
  16. set "str4=%%d"
  17. set "str5=%%e"
  18. set "str6=%%f"
  19. )
  20. :loop
  21. for /f "delims=" %%a in ('dir /b /a -d /o:d ".\B*" 2^>nul') do (
  22. set "txt=%%~fa"
  23. set "tm=%%~ta                        "
  24. set "tm=!tm:~,%l1%!"
  25. set "txtn=%%~na"
  26. set "txtn=!txtn:~,4!"
  27. set "ipr="
  28. for /f "tokens=1 delims= " %%i in ('findstr /L /I "!txtn!" ".\se\ipref.txt" 2^>nul') do (set "ipr=%%i")
  29. if "#!ipr!#" EQU "##" set "ipr=   -   "
  30. set "jhr="
  31. for /f "tokens=1 delims= " %%i in ('findstr /L /I "!txtn!" ".\se\jhref.txt" 2^>nul') do (set "jhr=%%i")
  32. if "#!jhr!#" EQU "##" set "jhr= -  "
  33. set "ipr=!ipr!         " &&set "ipr=!ipr:~,%l2%!"
  34. set "jhr=!jhr!         " &&set "jhr=!jhr:~,%l3%!"
  35. set /a "sum=0"
  36. for %%i in (%str%) do (
  37. set "%%i=0"
  38. set /a "num=0"
  39. for /f "delims=" %%x in ('findstr /L /I "%%i" "!txt!" 2^>nul') do (set /a "num+=1")
  40. set /a "sum+=num"
  41. set "%%i=!num!              "
  42. )
  43. set "%str1%=!%str1%:~,%l4%!"
  44. set "%str2%=!%str2%:~,%l5%!"
  45. set "%str3%=!%str3%:~,%l6%!"
  46. set "%str4%=!%str4%:~,%l7%!"
  47. set "%str5%=!%str5%:~,%l8%!"
  48. set "%str6%=!%str6%:~,%l9%!"
  49. echo.!tm! !txtn!     !ipr! !jhr! !%str1%! !%str2%! !%str3%! !%str4%! !%str5%! !%str6%! !sum! >>"!log!"
  50. echo.!tm! !txtn! !ipr! !jhr! !%str1%! !%str2%! !%str3%! !%str4%! !%str5%! !%str6%! !sum!
  51.         Rem 删除文件
  52.     del /q /f "!txt!" >nul
  53. )
  54. ping localhost -n %wts% >nul
  55. goto :loop
  56. call exit
复制代码

TOP

本帖最后由 WHY 于 2019-9-12 16:22 编辑
  1. @if(0)==(0) echo off
  2. cd /d "D:\se"
  3. :LOOP
  4. for /f %%i in ('WMIC OS get LocalDateTime ^| findstr [0-9]') do set "dt=%%i"
  5. dir /b /a-d /od *.txt | cscript //nologo //e:jscript "%~f0" >> ".\se\wltj%dt:~0,6%.txt"
  6. goto :LOOP
  7. pause & exit /b
  8. @end
  9. var fso = new ActiveXObject('Scripting.FileSystemObject');
  10. var arr = ['100M', '请求', '无法', 'unreach', '一般', 'failure'];
  11. var ip = [], jh = [], re = /B.../ig;
  12. var objFile = fso.OpenTextFile('.\\se\\ipref.txt', 1);
  13. while(!objFile.AtEndOfStream){
  14.     var s = objFile.ReadLine();
  15.     var m = s.match(/^ping\S*/i);
  16.     if( !m ) continue;
  17.     while( a = re.exec(s) ){ var k = a[0].toUpperCase(); if(!ip[k])ip[k] = m; }
  18. }
  19. objFile.Close();
  20. var objFile = fso.OpenTextFile('.\\se\\jhref.txt', 1);
  21. while(!objFile.AtEndOfStream){
  22.     var s = objFile.ReadLine();
  23.     var m = s.match(/^jh\S*/i);
  24.     if( !m ) continue;
  25.     while( a = re.exec(s) ){ var k = a[0].toUpperCase(); if(!jh[k])jh[k] = m; }
  26. }
  27. objFile.Close();
  28. while( !WSH.StdIn.AtEndOfStream ){
  29.     var f = fso.GetFile( WSH.StdIn.ReadLine() );
  30.     if( !/^B....*\.txt$/i.test(f.Name) ) continue;
  31.     var dt = new Date( f.DateLastModified );
  32.     var s1 = dt.toLocaleString();                        //第1列
  33.     var s2 = f.Name.substr(0,4).toUpperCase();           //第2列
  34.     var s3 = ip[s2] ? ip[s2] : '-';                      //第3列
  35.     var s4 = jh[s2] ? jh[s2] : '-';                      //第4列
  36.     var s5 = getFileData(f.Path);                        //第5-11列
  37.     WSH.Echo(s1 + '\t' + s2 + '\t' + s3 + '\t' + s4 + '\t' + s5);
  38.     if(fso.FileExists(f.Path)) f.Delete();    //删除文件
  39. }
  40. function getFileData(fPath){
  41.     var map = [], s = '', total = 0;
  42.     for(var i in arr) map[arr[i]] = 0;
  43.     var reg = new RegExp(arr.join('|'), 'ig');
  44.     var objFile = fso.OpenTextFile(fPath, 1);
  45.     var str = objFile.ReadAll();
  46.     objFile.Close();
  47.     while( a = reg.exec(str) ) map[a[0]]++;
  48.     for(var i=0; i<arr.length; i++){ s += map[arr[i]] + '\t'; if(i>0)total += map[arr[i]]; }
  49.     return s + total;
  50. }
  51. WScript.Sleep(20 * 1000); //延时20s
复制代码

TOP

返回列表