使用算术运算符将时间转换为秒
Converting time to seconds using arithmetic operators
我正在尝试将文本文件中的时间值从 hr:min:sec.sec 转换为秒。我在每行的第 1 列中有一个包含事件编号(连续顺序、1、2、3 等)的文件,该行的其余部分是事件数据,如下面的示例所示。我想让用户输入两个数字,我的脚本用这两个数字获取每个事件的相应 hr:min:sec 并转换为仅秒数。
文件格式为 4 000-01:04:10.983745 34.56 string1 string_2
(这将是第 4 行,其 date/time,以秒为单位的持续时间,以及接下来两列中的两个静态字符串。
我正在使用 for 循环获取标记 1、2 和 3,使用 :
作为 delims,然后只是为了执行算术而修剪字符串。
所以%%A
应该是4 000-01
,%%B
应该是04
,%%C
应该是其他的都行。现在我刚刚读到 batch doesn't support decmials,所以如果需要我可以不用它们。但这没有返回任何东西:
setlocal enabledelayedexpansion enableextension
REM auto-setting event values for testing
set begin=3
set end=4
for /f "tokens=1,2,3 delims=:" %%A in ('findstr /b /c:"!begin![^0-9]" event.txt') do (
set "hr=%%A"
set /A "min=%%B"
set "sec=%%C"
set /A "hr=!hr:~-2!"
set /A "sec=!sec:~0,2!"
set /A "total=(hr*3600)+(min*60)+sec"
echo !total!>>time.txt
)
exit /B
如果您的文件格式是:
line 4 000-01:04:10.983745 34.56 string1 string_2
delim - : : .
token 1 2 3 4
var - A B C
避免前导 zero/octal 问题的常用技术是在前缀
两位小数,字面量为 1 并减去 100。
Set /A
允许在以逗号分隔的行上进行多次计算,变量不需要用百分号括起来(不适用于 for/arg 变量)。
@Echo off
setlocal enabledelayedexpansion enableextensions
for /f "tokens=2-4 delims=-:." %%A in (
'findstr /b /C:"4 " event.txt'
) do Set /A "hr=1%%A-100,min=1%%B-100,sec=1%%C-100,total=hr*3600+min*60+sec"
echo Total is %total% (hr=%hr%, min=%min%, sec=%sec%)
echo %total% >>time.txt
exit /B
示例输出:
Total is 3850 (hr=1, min=4,sec=10)
这里有一种方法也考虑小数秒,四舍五入为六位小数:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "_SOURCE=event.txt"
set "_TARGET=time.txt"
set "_REGEX=^[0-9][0-9]* [0-3][0-9][0-9]-[0-9][0-9]:[0-5][0-9]:[0-5][0-9].[0-9][0-9]* "
rem // Convert filtered lines:
> "%_TARGET%" (
for /F "tokens=1-9* delims=:.- " %%A in ('findstr /R /C:"%_REGEX%" "%_SOURCE%"') do (
rem // Extract and store hour, minute, second values:
set "HOUR=1%%C" & set "MIN=1%%D" & set "SEC=1%%E"
rem // Extract and store fractional seconds and also the static strings:
set "FRAC=1%%F0000000" & set "STR1=%%I" & set "STR2=%%J"
rem // Convert hour, minute, second values to decimal integers:
set /A "HOUR%%=100, MIN%%=100, SEC%%=100"
setlocal EnableDelayedExpansion
rem // Convert fractional seconds to decimal number:
set /A "FRAC=!FRAC:~,7!%%1000000+!FRAC:~7,1!/5"
rem // Compute integer seconds, round to 6 decimal places:
set /A "SEC+=60*(MIN+60*HOUR)+FRAC/1000000" & set "FRAC=000000!FRAC!"
rem // Rebuilt line with time value replaced by fractional seconds:
echo %%A %%B-!SEC!.!FRAC:~-6! %%G.%%H !STR1! !STR2!
endlocal
)
)
endlocal
exit /B
我正在尝试将文本文件中的时间值从 hr:min:sec.sec 转换为秒。我在每行的第 1 列中有一个包含事件编号(连续顺序、1、2、3 等)的文件,该行的其余部分是事件数据,如下面的示例所示。我想让用户输入两个数字,我的脚本用这两个数字获取每个事件的相应 hr:min:sec 并转换为仅秒数。
文件格式为 4 000-01:04:10.983745 34.56 string1 string_2
(这将是第 4 行,其 date/time,以秒为单位的持续时间,以及接下来两列中的两个静态字符串。
我正在使用 for 循环获取标记 1、2 和 3,使用 :
作为 delims,然后只是为了执行算术而修剪字符串。
所以%%A
应该是4 000-01
,%%B
应该是04
,%%C
应该是其他的都行。现在我刚刚读到 batch doesn't support decmials,所以如果需要我可以不用它们。但这没有返回任何东西:
setlocal enabledelayedexpansion enableextension
REM auto-setting event values for testing
set begin=3
set end=4
for /f "tokens=1,2,3 delims=:" %%A in ('findstr /b /c:"!begin![^0-9]" event.txt') do (
set "hr=%%A"
set /A "min=%%B"
set "sec=%%C"
set /A "hr=!hr:~-2!"
set /A "sec=!sec:~0,2!"
set /A "total=(hr*3600)+(min*60)+sec"
echo !total!>>time.txt
)
exit /B
如果您的文件格式是:
line 4 000-01:04:10.983745 34.56 string1 string_2
delim - : : .
token 1 2 3 4
var - A B C
避免前导 zero/octal 问题的常用技术是在前缀
两位小数,字面量为 1 并减去 100。
Set /A
允许在以逗号分隔的行上进行多次计算,变量不需要用百分号括起来(不适用于 for/arg 变量)。
@Echo off
setlocal enabledelayedexpansion enableextensions
for /f "tokens=2-4 delims=-:." %%A in (
'findstr /b /C:"4 " event.txt'
) do Set /A "hr=1%%A-100,min=1%%B-100,sec=1%%C-100,total=hr*3600+min*60+sec"
echo Total is %total% (hr=%hr%, min=%min%, sec=%sec%)
echo %total% >>time.txt
exit /B
示例输出:
Total is 3850 (hr=1, min=4,sec=10)
这里有一种方法也考虑小数秒,四舍五入为六位小数:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "_SOURCE=event.txt"
set "_TARGET=time.txt"
set "_REGEX=^[0-9][0-9]* [0-3][0-9][0-9]-[0-9][0-9]:[0-5][0-9]:[0-5][0-9].[0-9][0-9]* "
rem // Convert filtered lines:
> "%_TARGET%" (
for /F "tokens=1-9* delims=:.- " %%A in ('findstr /R /C:"%_REGEX%" "%_SOURCE%"') do (
rem // Extract and store hour, minute, second values:
set "HOUR=1%%C" & set "MIN=1%%D" & set "SEC=1%%E"
rem // Extract and store fractional seconds and also the static strings:
set "FRAC=1%%F0000000" & set "STR1=%%I" & set "STR2=%%J"
rem // Convert hour, minute, second values to decimal integers:
set /A "HOUR%%=100, MIN%%=100, SEC%%=100"
setlocal EnableDelayedExpansion
rem // Convert fractional seconds to decimal number:
set /A "FRAC=!FRAC:~,7!%%1000000+!FRAC:~7,1!/5"
rem // Compute integer seconds, round to 6 decimal places:
set /A "SEC+=60*(MIN+60*HOUR)+FRAC/1000000" & set "FRAC=000000!FRAC!"
rem // Rebuilt line with time value replaced by fractional seconds:
echo %%A %%B-!SEC!.!FRAC:~-6! %%G.%%H !STR1! !STR2!
endlocal
)
)
endlocal
exit /B