[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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
如何实现,望大家能予以指点,谢谢!

回复 17# went


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

TOP

回复 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
复制代码

TOP

回复 15# went


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

TOP

回复 14# xslxslxsl


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

TOP

回复 13# went


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

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

回复 11# idwma


    那个更是一闪而过

TOP

回复 10# xslxslxsl


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

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

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

TOP

回复 5# idwma


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

TOP

回复 5# idwma


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

TOP

回复 3# yakeyun


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

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

返回列表