我有一个数据文本文件,我想从特定行的特定位置提取两个值。
[0xA1 rr]
I2C START BIT
WRITE: 0xA1 ACK
READ: 0x61
READ: ACK 0xA8
NACK
I2C STOP BIT
I2C>
I2C>在上面的文件中,我想把'61‘在第4行,'A8’在第5行。“0x”之后的值会发生变化,但总是位于相同位置的两个字符(然后我将组合这些字符并将其从十六进制转换为十进制)。
看起来,我可以使用如下代码获取整个特定行:
for /F "skip=3 delims=" %%i in ("%FileName%") set "Line04=%%i"我可以使用如下代码从特定字符后面获取值:
FOR /f "usebackqtokens=1*delims=:" %%a IN ("%FileName%") DO (
IF "%%a"=="0x" SET /a Byte01=%%b
)但我不需要在'0x‘之后的所有值,只需要第4行和第5行中的两个值。
我很难将这些命令连接到一起,以便从这两行中每一行获取所需的两个字符。
有人能帮我把所有这些片段(或其他我还没弄清楚的部分)放在一起,把我需要的这些值从文件中提取出来吗?
发布于 2021-06-03 18:16:07
两个字节值可以从文件中读取,如下代码所示:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "FileName=%TEMP%\%~n0.tmp"
(
echo [0xA1 rr]
echo I2C START BIT
echo WRITE: 0xA1 ACK
echo READ: 0x61
echo READ: ACK 0xA8
echo NACK
echo I2C STOP BIT
echo I2C^>
echo I2C^>
)>"%FileName%"
set "Byte01="
set "Byte02="
for /F "usebackq skip=3 tokens=2,3" %%I in ("%FileName%") do if not defined Byte01 (set /A "Byte01=%%I") else (set /A "Byte02=%%J" & goto Output)
:Output
if defined Byte01 (
echo The byte values are:
echo/
set Byte
)
del "%FileName%"
endlocal带有使用选项的命令跳过文件的前三行。
第四行首先使用默认的字符串分隔符、普通空格和水平选项卡拆分为子字符串。第二个子字符串是0x61,它被分配给指定的循环变量I。第四行没有第三个子字符串。
if 条件检查环境变量Byte01是否在FOR循环上显式地未定义,在这种情况下,使用命令SET来计算一个算术表达式,该表达式将分配给循环变量I的字符串值0x61解释为十六进制值,并将此值以十进制形式分配给环境变量Byte01。
然后,FOR处理第五行,使用空格/制表符作为分隔符,再次将该行拆分成子字符串,并根据ASCII表分配第二个子字符串(令牌) ACK来循环变量I,将第三个子字符串0xA8分配给next (但只有一个循环变量J )。
接下来将再次执行IF条件,但这一次Byte01已被定义为在命令块上继续进行批处理,命令SET用于计算用于定义环境变量Byte02的算术表达式,分配给循环变量J的十六进制值转换为十进制值E 131和e 232命令e 133GOTOE 234继续处理标签Output下面一行的批处理文件。这导致循环在处理文件中的更多行之前退出。
要了解所使用的命令及其工作方式,请打开一个命令提示符窗口,在那里执行以下命令,并非常仔细地读取为每个命令显示的所有帮助页。
call /? ...解释%~n0 (参数0的名称,即批处理文件名)del /?echo /?endlocal /?for /?if /?set /?setlocal /?另请参阅:
https://stackoverflow.com/questions/67825752
复制相似问题