首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用批处理文件从文件中的特定行读取特定字符?

如何用批处理文件从文件中的特定行读取特定字符?
EN

Stack Overflow用户
提问于 2021-06-03 17:04:22
回答 1查看 296关注 0票数 1

我有一个数据文本文件,我想从特定行的特定位置提取两个值。

代码语言:javascript
运行
复制
[0xA1 rr] 
I2C START BIT
WRITE: 0xA1 ACK 
READ: 0x61 
READ:  ACK 0xA8 
NACK
I2C STOP BIT
I2C>
I2C>

在上面的文件中,我想把'61‘在第4行,'A8’在第5行。“0x”之后的值会发生变化,但总是位于相同位置的两个字符(然后我将组合这些字符并将其从十六进制转换为十进制)。

看起来,我可以使用如下代码获取整个特定行:

代码语言:javascript
运行
复制
for /F "skip=3 delims=" %%i in ("%FileName%") set "Line04=%%i"

我可以使用如下代码从特定字符后面获取值:

代码语言:javascript
运行
复制
FOR /f "usebackqtokens=1*delims=:" %%a IN ("%FileName%") DO (
 IF "%%a"=="0x" SET /a Byte01=%%b
)

但我不需要在'0x‘之后的所有值,只需要第4行和第5行中的两个值。

我很难将这些命令连接到一起,以便从这两行中每一行获取所需的两个字符。

有人能帮我把所有这些片段(或其他我还没弄清楚的部分)放在一起,把我需要的这些值从文件中提取出来吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-03 18:16:07

两个字节值可以从文件中读取,如下代码所示:

代码语言:javascript
运行
复制
@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 131e 232命令e 133GOTOE 234继续处理标签Output下面一行的批处理文件。这导致循环在处理文件中的更多行之前退出。

要了解所使用的命令及其工作方式,请打开一个命令提示符窗口,在那里执行以下命令,并非常仔细地读取为每个命令显示的所有帮助页。

  • call /? ...解释%~n0 (参数0的名称,即批处理文件名)
  • del /?
  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • set /?
  • setlocal /?

另请参阅:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67825752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档