【发布时间】:2020-11-13 01:45:28
【问题描述】:
我一直在尝试从文本文件中逐行读取。在每一行中,我在第 3 列和第 4 列中确实有“开始时间”和“结束时间”字段,如下所示。
文件1,110543,2020-07-18T03:09:12.1321687+00:00,2020-07-18T03:10:22.4097433+00:00,000001
文件2,210543,2020-07-18T04:19:28.0459100+00:00,2020-07-18T04:26:08.6626472+00:00,000002
我只想使用下面的脚本找出“开始时间”和“结束时间”列之间的区别。
@Echo off&Setlocal EnableExtensions EnableDelayedExpansion
IF EXIST "%csvFilePath%tempfile.txt" (
( for /f "tokens=1-5 delims=," %%A in (%csvFilePath%tempfile.txt) do (
echo fileRecord %%A,%%B,%%C,%%D,%%E
for /f "tokens=1,2,3,4 delims=T:." %%a in ("%%C") Do (
set starttime=%%b:%%c:%%d
)
for /f "tokens=1,2,3,4 delims=T:." %%a in ("%%D") Do (
set endtime=%%b:%%c:%%d
)
echo !starttime!
echo !endtime!
set options="tokens=1-4 delims=:.,"
for /f %options% %%a in (!starttime!) do set start_h=%%a&set /a start_m=100%%b %% 100&set /a start_s=100%%c %% 100&set /a start_ms=100%%d %% 100
for /f %options% %%a in (!endtime!) do set end_h=%%a&set /a end_m=100%%b %% 100&set /a end_s=100%%c %% 100&set /a end_ms=100%%d %% 1
set /a hours=%end_h%-%start_h%
set /a mins=%end_m%-%start_m%
set /a secs=%end_s%-%start_s%
set /a ms=%end_ms%-%start_ms%
if %ms% lss 0 set /a secs = %secs% - 1 & set /a ms = 100%ms%
if %secs% lss 0 set /a mins = %mins% - 1 & set /a secs = 60%secs%
if %mins% lss 0 set /a hours = %hours% - 1 & set /a mins = 60%mins%
if %hours% lss 0 set /a hours = 24%hours%
if 1%ms% lss 100 set ms=0%ms%
:: Mission accomplished
set /a totalsecs = %hours%*3600 + %mins%*60 + %secs%
echo command took %hours%:%mins%:%secs%.%ms% (%totalsecs%.%ms%s total))))
start(03:09:12) & endtime(03:10:22) 值在我使用 时按预期为 line1 打印!开始时间! & !endtime!。我正在尝试传递相同的变量来计算下一行中的差异。
for /f %options% %%a in (!starttime!) do set start_h=%%a&set /a start_m=100%%b %% 100&set /a start_s=100%%c %% 100&set /a start_ms=100%%d %% 100
for /f %options% %%a in (!endtime!) do set end_h=%%a&set /a end_m=100%%b %% 100&set /a end_s=100%%c %% 100&set /a end_ms=100%%d %% 1
执行后,我收到“0 is unexpected at this time”。你能帮我解决这个问题吗
【问题讨论】:
-
你的代码结构我不清楚。检查括号。三个明显的要点:要处理字符串,请将其括在引号中:
for /f %options% %%a in ("!starttime!") do和echo command took...行中的)必须转义(^))才能不结束代码块和(格式错误的)标签在循环/代码块中是不允许的。对于 cmets,使用REM而不是::。 -
您好斯蒂芬,感谢您的回复!括号放置正确。当我在这里复制代码时,括号列在代码块之外。因此,我只是在代码块中手动附加了括号。而且,我尝试使用“!starttime!”双引号也仍然出现相同的错误。
标签: loops for-loop batch-file cmd