标题: [文本处理] 批处理如何统计在同一个工作组联系工作时间? [打印本页]
作者: 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- $txt = '.\aa.txt';
- $contents= Import-Csv -Path $txt -Encoding Default|%{[pscustomobject]@{name=$_.姓名;time=$_.工作时间;work=$_.工作组}}
-
- $contents|group name,work|Where{$_.Group.Count -ge 2}|foreach{
- $t=$_.Group.time.Foreach{$_ -as [datetime]}
- $max = ($t|measure -Maximum).Maximum;
- $min = ($t|measure -Minimum).Minimum;
- $tL = $max-$min;
- $user = $_.Name.Split(',');
- [pscustomobject]@{姓名=$user[0];工作组=$user[1]; 工作时长="{0}d{1}h{2}m{3}s" -f $tL.Days,$tL.Hours,$tL.Minutes,$tL.Seconds;}
- }#|sc '.\result.log' -force;
- pause;
复制代码
作者: idwma 时间: 2022-4-25 21:17
- #@&cls&powershell "type %~s0|out-string|iex"&pause&exit
- $a=@{}
- (gc aa.txt) -notmatch '姓名,工作时间,工作组'|%{
- $b=$_ -split ','
- if($a[$b[0]] -eq $null){$a[$b[0]]+=@{$b[2]=@($b[1])}}else{$a[$b[0]][$b[2]]+=@($b[1])}
- }
- $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- @echo off & cd /d "%~dp0"
- setlocal enabledelayedexpansion
- REM 输入输出文件
- set "in_txt=info.txt"
- set "out_txt=out.txt"
- (
- for /f "usebackq skip=1 tokens=1-3 delims=," %%i in ("%in_txt%") do (
- if not "!%%i_%%k!"=="" (
- 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 (
- echo %%i,%%a,%%k
- set "%%i_%%k="
- )
- ) else (
- set "%%i_%%k_begin=%%j"
- set "%%i_%%k=1"
- )
- )
- )>"%out_txt%"
- 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
试试- @echo off & cd /d "%~dp0"
- setlocal enabledelayedexpansion
- REM 输入输出文件
- set "in_txt=info.txt"
- set "out_txt=out.txt"
- (
- for /f "usebackq skip=1 tokens=1-3 delims=," %%i in ("%in_txt%") do (
- if "!last1!"=="" (
- set "last1=%%i" & set "last2=%%j" & set "last3=%%k"
- ) else (
- if not "!last1!"=="%%i" (
- set "last1=%%i" & set "last2=%%j" & set "last3=%%k"
- ) else (
- if not "!last3!"=="%%k" (
- 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!
- set "last1=%%i" & set "last2=%%j" & set "last3=%%k"
- )
- )
- )
- )
- )>"%out_txt%"
- pause&exit
复制代码
作者: xslxslxsl 时间: 2022-4-26 07:49
回复 17# went
非常感谢,收下好好学习,再次感谢,太麻烦你了,感谢大家!
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |