Board logo

标题: [文本处理] 批处理如何统计在同一个工作组联系工作时间? [打印本页]

作者: xslxslxsl    时间: 2022-4-25 14:53     标题: 批处理如何统计在同一个工作组联系工作时间?

打算统计不同人员在不同工作组中连续工作的时长(在同一个工作组中连续工作时间长,主要是同个工作组连续)内容:
姓名,工作时间,工作组
张三,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
如何实现,望大家能予以指点,谢谢!
作者: hlzj88    时间: 2022-4-25 19:24

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

回复 2# hlzj88

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

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

不知道帖主是不是要实现这个功能
作者: xczxczxcz    时间: 2022-4-25 20:42

暂时无聊,发一个 保存为 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;
复制代码

作者: idwma    时间: 2022-4-25 21:17

  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]),$_}}
复制代码

作者: xslxslxsl    时间: 2022-4-25 21:24

回复 3# yakeyun


    其实就是想比较一下,每个人在一个区域内连续工作时间。感谢回复,谢谢了!
作者: xslxslxsl    时间: 2022-4-25 21:25

回复 5# idwma


    感谢回复,谢谢!但是我的能力目前还看不懂
作者: xslxslxsl    时间: 2022-4-25 21:27

回复 5# idwma


    谢谢,能否耐心指导一下,我看不懂,我应该如何执行,麻烦再指点一二,谢谢!
作者: idwma    时间: 2022-4-25 21:44

看不懂那把这个当成bat代码来用...
里面的文件名自己改一下
作者: xslxslxsl    时间: 2022-4-25 22:16

回复 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
作者: idwma    时间: 2022-4-25 22:33

回复 10# xslxslxsl


    这样啊可能不适合你的环境,试试楼上大佬的那个也可以用的
作者: xslxslxsl    时间: 2022-4-25 22:35

回复 11# idwma


    那个更是一闪而过
作者: went    时间: 2022-4-25 22:44

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

作者: xslxslxsl    时间: 2022-4-25 23:25

回复 13# went


    非常感谢,但是结果不对,不是在同一个工作组连续工作的时间,如果要计算差值怎么计算呢?
作者: went    时间: 2022-4-25 23:38

回复 14# xslxslxsl


    计算差值用了powershell,有点慢,上面添加了
作者: xslxslxsl    时间: 2022-4-25 23:56

回复 15# went


    真的非常感谢,就是计算时间的时候,不是我想的结果,举例子,张三在工作组A连续工作的时间,我是那张三切换到工作组B的时间减去工作组A的的第一个时间,当作在工作组A连续工作时间。
非常感谢你了,姓名一样,工作发生变化了就和上个工作组的第一个时间去减,麻烦再指点一下,谢谢!知道已经挺麻烦你了,但是我总想学着弄明白,谢谢!
作者: went    时间: 2022-4-26 00:20

回复 16# xslxslxsl


    试试
  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 "!last1!"=="" (
  9. set "last1=%%i" & set "last2=%%j" & set "last3=%%k"
  10. ) else (
  11. if not "!last1!"=="%%i" (
  12. set "last1=%%i" & set "last2=%%j" & set "last3=%%k"
  13. ) else (
  14. if not "!last3!"=="%%k" (
  15. for /f "delims=" %%a in ('powershell -c "$t=([datetime]'%%j' - [datetime]'!last2!');'{0:00}时{1:00}分{2:00}秒' -f ($t.Hours+$t.Days*24^),$t.Minutes,$t.Seconds"') do echo %%i,%%a,!last3!
  16. set "last1=%%i" & set "last2=%%j" & set "last3=%%k"
  17. )
  18. )
  19. )
  20. )
  21. )>"%out_txt%"
  22. pause&exit
复制代码

作者: xslxslxsl    时间: 2022-4-26 07:49

回复 17# went


非常感谢,收下好好学习,再次感谢,太麻烦你了,感谢大家!




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