Board logo

标题: 【已解决】100元批处理txt文本处理格式规整及统计 [打印本页]

作者: arwind    时间: 2019-12-4 16:21     标题: 【已解决】100元批处理txt文本处理格式规整及统计

本帖最后由 arwind 于 2019-12-6 07:39 编辑

具体报酬:100元人民币。
支付方式:支付宝。
联系方式:QQ2019532328。
有效期限:2019年12月31日之前。
需求描述:
(1)系统环境(win10 pro简体版)
(2)想要实现的功能的具体描述
原始内容大概如下:
ID:10001010 [ 档案 上传成功] 文件100001) 次数:1 时间:2019/12/03 8:45:15
ID:10001010 [ 档案 上传失败] 文件:(100001) 次数:1 时间:2019/12/03 8:45:03
ID:10001010 [ 档案 上传成功] 文件:(100002) 次数:1 时间:2019/12/03 8:44:51
ID:10001010 [ 档案 上传失败] 文件:(100002) 次数:1 时间:2019/12/04 17:19:13
ID:10001010 [ 档案 上传成功] 文件:(100003) 次数:1 时间:2019/12/04 17:19:12
ID:10001010 [ 档案 上传失败] 文件:(100003) 次数:1 时间:2019/12/04 17:19:12
ID:10001013 [ 档案 上传成功] 文件:(100004) 次数:1 时间:2019/12/04 17:19:11
ID:10001013 [ 档案 上传失败] 文件:(100004) 次数:1 时间:2019/12/04 17:19:01
文件共有四种,每种都有成功失败的情况,其中100001和100002是一类,100003和100004是二类;
ID号有几千个不连续的数字;日期格式yyyy/MM/dd
处理流程:
1) 对同目录下多个txt文档进行处理,txt里还会有一些其他零碎的内容,第一步先清理数据,删除不含“[ 档案”的行;
2) 第二步删除时间内容在运行脚本日期前一天(或前两天,请保留两份代码并注明)06:00之前的行;
3) 第三步删除“ID:”并替换“ [ 档案 上传”、“] 文件:(”、“) 次数:”、“ 时间:”为“,”;
4)第四步以每个ID号为顺序输出结果到“文件名+运行脚本当天日期+结果.txt”,统计单个txt内容不涉及跨文件统计,内容如:
     10001010上传100001成功x次,失败x次;上传100002成功x次,失败x次,共上传x(100001与100002出现的总次数)次
     10001010上传100003成功x次,失败x次;上传100004成功x次,失败x次,共上传x(100003与100004出现的总次数)次
      及下面其中一种符合的情况内容。
      当100001与100002出现的总次数为0时,记录内容:10001010上传100001、100002零次;
      当100003与100004出现的总次数为0时,记录内容:10001010上传100003、100004零次;
      当100001与100002出现的总次数为不为零且成功次数为零时,记录内容:10001010上传100001、100002完全失败;
      当100003与100004出现的总次数为不为零且成功次数为零时,记录内容:10001010上传100003、100004完全失败;
      当100001与100002出现的总次数为不为零且成功次数不为零时,记录内容:10001010上传(100001与100002出现的总次数)次,成功(100001+100002成功总次数)次,结余(【100001与100002出现的总次数)-(100001+100002成功总次数)*3】;
      当100003与100004出现的总次数为不为零且成功次数不为零时,记录内容:10001010上传(100001与100002出现的总次数)次,成功(100001+100002成功总次数)次,结余(【100001与100002出现的总次数)-(100001+100002成功总次数)*4】;
(3)测试数据及期待结果
(4)其它补充信息
小白不太清楚批处理的功能范围和难度,暂时列的是批处理,无论bat powershell或者其他方式能实现都可以。
作者: zaqmlp    时间: 2019-12-4 19:08

本帖最后由 zaqmlp 于 2019-12-4 19:09 编辑
  1. <# :
  2. cls
  3. @echo off
  4. set info=互助互利,支付宝扫码头像,感谢赞助
  5. title %info%
  6. set "rootpath=%~dp0"
  7. if "%rootpath:~-1%" equ "\" (set "rootpath=%rootpath:~,-1%")
  8. cd /d "%rootpath%"
  9. powershell -NoProfile -ExecutionPolicy bypass "Invoke-Command -ScriptBlock ([ScriptBlock]::Create([IO.File]::ReadAllText('%~f0',[Text.Encoding]::Default))) -Args '%rootpath%'"
  10. echo;%info%
  11. pause
  12. exit
  13. #>
  14. $ago=-1;
  15. $today=get-date;
  16. $agotime=get-date ($today.adddays($ago).toString('yyyy-MM-dd')+' 06:00:00');
  17. $newfolder=$args[0]+'\#result';
  18. if(-not (test-path -liter $newfolder)){[void](md $newfolder -force)};
  19. $files=@(dir -liter $args[0]|?{('.txt' -eq $_.Extension) -and ($_ -is [System.IO.FileInfo])});
  20. for($i=0;$i -lt $files.length;$i++){
  21.     write-host $files[$i];
  22.     [System.Collections.ArrayList]$list=@();
  23.     $dic=New-Object 'System.Collections.Generic.Dictionary[string,Object]';
  24.     $text=[IO.File]::ReadAllLines($files[$i].FullName,[Text.Encoding]::Default);
  25.     for($j=0;$j -lt $text.count;$j++){
  26.         if($text[$j].Contains('[ 档案')){
  27.             $arr=$text[$j].trim() -split '时间:';
  28.             if($arr[1] -ne ''){
  29.                 $dt=get-date $arr[1];
  30.                 if($dt -ge $agotime){
  31.                     $line=$text[$j].trim().replace('ID:','') -replace ' \[ 档案  上传|\] 文件:\(|\) 次数:| 时间:',',';
  32.                     $brr=$line.split(',');
  33.                     if(-not $dic.ContainsKey($brr[0])){
  34.                         $crr=@{
  35.                             '100001'=@{'成功'=0;'失败'=0};
  36.                             '100002'=@{'成功'=0;'失败'=0};
  37.                             '100003'=@{'成功'=0;'失败'=0};
  38.                             '100004'=@{'成功'=0;'失败'=0}
  39.                         };
  40.                         $dic.add($brr[0], $crr);
  41.                     }
  42.                     $dic[$brr[0]][$brr[2]][$brr[1]]++;
  43.                     [void]$list.add($line);
  44.                 };
  45.             };
  46.         };
  47.     };
  48.     [IO.File]::WriteAllLines($files[$i].FullName, $list, [Text.Encoding]::Default);
  49.    
  50.     $newfile=$newfolder+'\'+$files[$i].BaseName+'_'+$today.toString('yyyy-MM-dd')+'_结果.txt';
  51.     [System.Collections.ArrayList]$list=@();
  52.     foreach($a in $dic.Keys){
  53.         $b=$dic[$a]['100001']['成功']+$dic[$a]['100001']['失败']+$dic[$a]['100002']['成功']+$dic[$a]['100002']['失败'];
  54.         $line=$a+'上传100001成功'+$dic[$a]['100001']['成功']+'次,失败'+$dic[$a]['100001']['失败']+'次;上传100002成功'+$dic[$a]['100001']['成功']+'次,失败'+$dic[$a]['100001']['失败']+'次,共上传'+$b+'次';
  55.         [void]$list.add($line);
  56.         $c=$dic[$a]['100003']['成功']+$dic[$a]['100003']['失败']+$dic[$a]['100004']['成功']+$dic[$a]['100004']['失败'];
  57.         $line=$a+'上传100003成功'+$dic[$a]['100003']['成功']+'次,失败'+$dic[$a]['100003']['失败']+'次;上传100004成功'+$dic[$a]['100004']['成功']+'次,失败'+$dic[$a]['100004']['失败']+'次,共上传'+$c+'次';
  58.         [void]$list.add($line);
  59.         if($b -eq 0){
  60.             [void]$list.add($a+'上传100001、100002零次');
  61.         }else{
  62.             $d=$dic[$a]['100001']['成功']+$dic[$a]['100002']['成功'];
  63.             if($d -eq 0){
  64.                 [void]$list.add($a+'上传100001、100002完全失败');
  65.             }else{
  66.                 [void]$list.add($a+'上传100001、100002'+$b+'次,成功'+$d+'次,结余'+($b-$d*3));
  67.             };
  68.         };
  69.         if($c -eq 0){
  70.             [void]$list.add($a+'上传100003、100004零次');
  71.         }else{
  72.             $d=$dic[$a]['100003']['成功']+$dic[$a]['100004']['成功'];
  73.             if($d -eq 0){
  74.                 [void]$list.add($a+'上传100003、100004完全失败');
  75.             }else{
  76.                 [void]$list.add($a+'上传100003、100004'+$c+'次,成功'+$d+'次,结余'+($c-$d*3));
  77.             };
  78.         };
  79.     };
  80.     [IO.File]::WriteAllLines($newfile, $list, [Text.Encoding]::Default);
  81. }
复制代码





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