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

[文本处理] 批处理如何统计在同一个工作组联系工作时间?

打算统计不同人员在不同工作组中连续工作的时长(在同一个工作组中连续工作时间长,主要是同个工作组连续)内容:
姓名,工作时间,工作组
张三,2022-03-01 12:33:26,工作组A
张三,2022-03-01 15:13:22,工作组A
张三,2022-03-01 17:03:06,工作组B
李四,2022-03-01 11:13:22,工作组A
李四,2022-03-01 13:15:01,工作组A
李四,2022-03-01 19:13:21,工作组B
李四,2022-03-01 22:19:28,工作组B
李四,2022-03-02 02:11:26,工作组B
李四,2022-03-02 03:11:26,工作组A
想得到:
张三,(2022-03-01 17:03:06-03-01 12:33:26)或直接得出差值,工作组A
李四,(2022-03-01 19:13:21-2022-03-01 11:13:22)或直接得出差值,工作组A
李四,(2022-03-02 03:11:26-2022-03-01 19:13:21)或直接得出差值,工作组B
如何实现,望大家能予以指点,谢谢!

其实,你的题目是有些看不懂,你要的结果,张三是把工作组a b都合并在一起。没有达到区分工作组的目的。在时间顺序上,又是颠倒的。
如果只是要统计一个人连续工作的时间,可以先排除不可能的时间,或给定一个通常的开始时间,余下的进行连续计时。不区分工作组。我理解可能是不同的打卡机。
目的,学习批处理

TOP

回复 2# hlzj88

应该是打卡机数据导出,计算是否不足工作时长的。这个可以把时分别剥离,然后时、分、秒转换为统一值“秒”。先做加法得出上班/下班时间点的数值,再做减法得出差值,最后用差值对比上班时长。

这个时长就可以和标准上班时长8小时(28800 秒)来做比较,如果不足就算做早退。

不知道帖主是不是要实现这个功能

TOP

暂时无聊,发一个 保存为 xxx.pa1
  1. $txt = '.\aa.txt';
  2. $contents= Import-Csv -Path $txt -Encoding Default|%{[pscustomobject]@{name=$_.姓名;time=$_.工作时间;work=$_.工作组}}
  3. $contents|group name,work|Where{$_.Group.Count -ge 2}|foreach{
  4. $t=$_.Group.time.Foreach{$_ -as [datetime]}
  5. $max = ($t|measure -Maximum).Maximum;
  6. $min = ($t|measure -Minimum).Minimum;
  7. $tL = $max-$min;
  8. $user = $_.Name.Split(',');
  9. [pscustomobject]@{姓名=$user[0];工作组=$user[1]; 工作时长="{0}d{1}h{2}m{3}s" -f $tL.Days,$tL.Hours,$tL.Minutes,$tL.Seconds;}
  10. }#|sc '.\result.log' -force;
  11. pause;
复制代码
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

  1. #@&cls&powershell "type %~s0|out-string|iex"&pause&exit
  2. $a=@{}
  3. (gc aa.txt) -notmatch '姓名,工作时间,工作组'|%{
  4. $b=$_ -split ','
  5. if($a[$b[0]] -eq $null){$a[$b[0]]+=@{$b[2]=@($b[1])}}else{$a[$b[0]][$b[2]]+=@($b[1])}
  6. }
  7. $a.keys|%{$t=$_;$a[$_].keys|%{'{0},{1},{2}' -f $t,$([datetime]$a[$t][$_][-1]-[datetime]$a[$t][$_][0]),$_}}
复制代码

TOP

回复 3# yakeyun


    其实就是想比较一下,每个人在一个区域内连续工作时间。感谢回复,谢谢了!

TOP

回复 5# idwma


    感谢回复,谢谢!但是我的能力目前还看不懂

TOP

回复 5# idwma


    谢谢,能否耐心指导一下,我看不懂,我应该如何执行,麻烦再指点一二,谢谢!

TOP

看不懂那把这个当成bat代码来用...
里面的文件名自己改一下

TOP

回复 9# idwma
复制代码执行BAT出现如下提示:


    iex : 所在位置 行:7 字符: 32
+ $a.keys|%{$t=$_;$a[$_].keys|%{'{0},{1},{2}' -f $t,$([datetime]$a[$t][ ...
+                                ~
表达式或语句中包含意外的标记“{”。
所在位置 行:7 字符: 43
+ ... '{0},{1},{2}' -f $t,$([datetime]$a[$t][$_][-1]-[datetime]$a[$t][$_][0 ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
字符串缺少终止符: '。
所在位置 行:7 字符: 43
+ ... '{0},{1},{2}' -f $t,$([datetime]$a[$t][$_][-1]-[datetime]$a[$t][$_][0 ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
表达式或语句中包含意外的标记“' -f $t,$([datetime]$a[$t][$_][-1]-[datetime]$a[$t][$_][0]),$_}}
”。
所在位置 行:1 字符: 58
+ type C:\Users\Administrator\Desktop\1.bat|out-string|iex
+                                                          ~~~
    + CategoryInfo          : ParserError: ( [Invoke-Expression], ParseException
    + FullyQualifiedErrorId : UnexpectedToken,Microsoft.PowerShell.Commands.InvokeExpressionCommand

TOP

回复 10# xslxslxsl


    这样啊可能不适合你的环境,试试楼上大佬的那个也可以用的

TOP

回复 11# idwma


    那个更是一闪而过

TOP

本帖最后由 went 于 2022-4-25 23:44 编辑

文本和bat都保存ansi编码
info.txt,  test.bat
  1. @echo off & cd /d "%~dp0"
  2. setlocal enabledelayedexpansion
  3. REM 输入输出文件
  4. set "in_txt=info.txt"
  5. set "out_txt=out.txt"
  6. (
  7. for /f "usebackq skip=1 tokens=1-3 delims=," %%i in ("%in_txt%") do (
  8. if not "!%%i_%%k!"=="" (
  9. for /f "delims=" %%a in ('powershell -c "$t=([datetime]'%%j' - [datetime]'!%%i_%%k_begin!');'{0:00}时{1:00}分{2:00}秒' -f ($t.Hours+$t.Days*24^),$t.Minutes,$t.Seconds"') do (
  10. echo %%i,%%a,%%k
  11. set "%%i_%%k="
  12. )
  13. ) else (
  14. set "%%i_%%k_begin=%%j"
  15. set "%%i_%%k=1"
  16. )
  17. )
  18. )>"%out_txt%"
  19. pause&exit
复制代码

TOP

回复 13# went


    非常感谢,但是结果不对,不是在同一个工作组连续工作的时间,如果要计算差值怎么计算呢?

TOP

回复 14# xslxslxsl


    计算差值用了powershell,有点慢,上面添加了

TOP

返回列表