标题: [文件操作] 批处理如何根据文本内容计算总时间? [打印本页]
作者: 娜美 时间: 2022-1-12 10:36 标题: 批处理如何根据文本内容计算总时间?
本帖最后由 娜美 于 2022-1-16 08:42 编辑
文本记录着不同企业的名称及执行时间 文本中倒数第一个 "企业"字段 肯定会记录着企业的名称, 根据倒数第一个企业的名称( 但是倒数第一个企业的名称不是固定的,文本是由系统自动记录会发生不同变化, 有可能是美尔达, 也有可能是腾尔或其它未知名称, 核心是以文本中倒数第一个 "企业"字段来确定未知企业名称 ) 需要计出 该企业名称 的所有执行的时间总数, 谢谢
Thanks
作者: Batcher 时间: 2022-1-12 10:55
回复 1# 娜美
只计算美尔达,不管腾尔或其它企业是吗?
作者: 娜美 时间: 2022-1-12 11:10
本帖最后由 娜美 于 2022-1-12 11:21 编辑
回复 娜美
只计算美尔达,不管腾尔或其它企业是吗?
Batcher 发表于 2022-1-12 10:55
No,按倒数最后一个企业名称 但是最后一个企业名称不是固定的, 有可能是美尔达,也有可能是腾尔或其它未知企业
作者: 娜美 时间: 2022-1-12 11:18
本帖最后由 娜美 于 2022-1-12 11:26 编辑
Batcher哥 能不能按倒数第一行 "企业" 字段来做 假定义出企业名称 然后按假定义的企业名称来进行时间统计 就能得到真实的倒数第一行企业名称总时间?
用倒数第一行 "企业" 的字段 来确定企业名称 这只是我初步想法
作者: 娜美 时间: 2022-1-12 11:41
本帖最后由 娜美 于 2022-1-12 11:56 编辑
可以入手对象字段似乎主要是下面这2行字段
企业
执行时间
是否可以先找出倒数第一个"企业"字段的名称是什么? 然后根据找出的倒数第一个"企业"的名称来进行时间总计?
只能想到这里了, 我脑子不好使...
作者: Batcher 时间: 2022-1-12 11:57
回复 4# 娜美
请找几个样本文件上传到阿里云盘或百度网盘,以便他人理解需求、测试代码。
作者: 娜美 时间: 2022-1-12 12:38
本帖最后由 娜美 于 2022-1-14 11:24 编辑
回复 6# Batcher
Batcher哥 好的 文本就是上面内容 系统就是以这样格式自动记录 都是一样的 只是加上了几个不同企业名称, 不同企业名称可能有几百个, 就略了
测试示例文本格式
https://wwe.lanzoul.com/if83yyr9pte
作者: Batcher 时间: 2022-1-12 15:36
回复 7# 娜美 - @echo off
- setlocal enabledelayedexpansion
- cd /d "%~dp0"
-
- set "FileInput=test.txt"
- set "FileOutput=out.txt"
-
- for /f "tokens=3" %%i in ('findstr /i /b "企业" "%FileInput%"') do (
- set "LastCompany=%%i"
- )
-
- set "ThisCompany=0"
- set "SumHour=0"
- set "SumMinute=0"
- set "SumSecond=0"
- for /f "tokens=1-3" %%i in ('type "%FileInput%"') do (
- if "%%i" equ "执行时间" (
- if !ThisCompany! equ 1 (
- for /f "tokens=1-3 delims=:hms" %%a in ("%%k") do (
- if "x%%c" neq "x" (
- set /a SumHour+=%%a
- set /a SumMinute+=%%b
- set /a SumSecond+=%%c
- ) else if "x%%b" neq "x" (
- set /a SumMinute+=%%a
- set /a SumSecond+=%%b
- ) else (
- set /a SumSecond+=%%a
- )
- )
- )
- ) else if "%%k" equ "%LastCompany%" (
- set "ThisCompany=1"
- ) else (
- set "ThisCompany=0"
- )
- )
-
- set /a AddMinute=SumSecond/60
- set /a AddHour=(SumMinute+AddMinute)/60
- set /a FinalHour=SumHour+AddHour
- set /a FinalMinute=(SumMinute+AddMinute)%%60
- set /a FinalSecond=SumSecond%%60
-
- >"%FileOutput%" echo %LastCompany% ^> !FinalHour!h:!FinalMinute!m:!FinalSecond!s
复制代码
作者: Batcher 时间: 2022-1-12 15:41
回复 7# 娜美
文本的编码格式、文本里面的空格或制表符或其它空白字符等很多因素会影响到代码的编写,所以最好能在最开始发帖求助的时候就把测试文本上传到网盘。
作者: 娜美 时间: 2022-1-12 16:44
回复 8# Batcher
多谢Batcher哥 还是Batcher哥最帅
作者: Batcher 时间: 2022-1-12 22:06
回复 11# 娜美
现在你知道6楼的作用了吧
作者: 娜美 时间: 2022-1-14 11:24
本帖最后由 娜美 于 2022-1-14 11:26 编辑
Batcher哥 有计算效率可以更快点的没, 计算一个30mb的文件内容似乎需要很久很久
https://wwe.lanzoul.com/if83yyr9pte
作者: xczxczxcz 时间: 2022-1-14 19:11
这种按日期计算很方便,把每个结果叠加到日期上,最后再减去最初定的日期。
作者: 娜美 时间: 2022-1-14 19:19
这种按日期计算很方便,把每个结果叠加到日期上,最后再减去最初定的日期。
xczxczxcz 发表于 2022-1-14 19:11
Batcher哥的得到结果是正确的,但是效率慢慢 可能需要用到awk 或Powershlle 哥哥你有更快的吗
作者: idwma 时间: 2022-1-14 21:31
本帖最后由 idwma 于 2022-1-14 22:43 编辑
- #@&cls&powershell "type %~s0|out-string|iex"&pause&exit
- $in='test.txt'
- $out='out.txt'
- $a="$((gc $in -readcount 0) -match '企业|执行时间')" -split '.(?=企业)'
- $b=($a[-1] -split '\s+')[2]
- foreach($i in $($a -match $b -match '执行时间' -replace '.*>\s+|[hms]' -replace '^([^:]*?):([^:]*?)$','0:$1:$2')){$c+=[timespan]$i}
- sc $out ("$b > {0}h:{1:mm\m:ss\s}" -f ($c.days*24+$c.Hours),[datetime]$c.ticks)
复制代码
作者: 娜美 时间: 2022-1-14 22:23
本帖最后由 娜美 于 2022-1-16 08:43 编辑
回复 17# idwma
哇塞, 计算得好快呀 多谢idwma哥
作者: 娜美 时间: 2022-1-15 09:21
回复 17# idwma
谢谢idwma哥 还是idwma哥够帅 THANKS THANKS
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |