【问题标题】:Batch loopvariable manipulation批处理循环变量操作
【发布时间】:2020-04-02 11:42:33
【问题描述】:

我有一个 .bat 文件的小问题,我必须构建它来操作特定的 .csv。 我希望 .bat 读取文件的行,然后检查该行的前三个字母。最后应该有 n 个文件,其中文件 xxx.csv 包含 input.csv 的行,其中 xxx 作为行的前三个字母。

首先,我什至不知道是否可以在批处理文件中完成这项工作,因为该文件有 >85000 行,甚至可能会变得更大。所以如果不可能,你可以直接告诉我。

for /f "delims=" %%a in (input.CSV) DO (
echo %%~a:~0,3
pause
)

我想“输出” %%a 的前三个字母。

如果你能帮助我,那就太好了。

菲尔

【问题讨论】:

  • 字符串替换只能用环境变量完成,不能用循环变量。打开command prompt,运行set /?,并仔细阅读从第一页顶部到最后一页底部的输出帮助,尤其是关于字符串替换以及何时以及如何使用delayed expansion 的部分,在IF 上进行了解释FOR 示例。另见:Variables are not behaving as expected
  • 我建议在命令提示符窗口中运行for /? 并仔细阅读从第一页顶部到最后一页底部的此命令的帮助。可能取决于已处理 CSV 文件的未知内容,使用 for /F 和适当的 eol=tokens=delims= 选项足以将您想要进一步使用的字符串分配给循环变量。另请参阅this long answer,这对您作为初学者编写 Windows 批处理文件非常有帮助。
  • 如果你在操作 csv,你应该使用 powershell。蝙蝠可以做到,但它不适合这项工作,而且要困难 10 倍。你的问题也有点令人困惑。有什么办法可以澄清一下?

标签: batch-file trim


【解决方案1】:

子字符串替换仅适用于环境变量 (%var%),但不适用于元变量 (%%a)(正如 Mofi 已经评论的那样)。而且因为您在同一个命令块中设置和使用变量,所以您需要delayed expansion

setlocal enabledelayedexpansion
for /f "delims=" %%a in (input.CSV) DO (
  set "var=%%~a"
  echo !var:~0,3!
  pause
)

(有些方法没有延迟扩展,但它们使用call,这会减慢速度)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多