批处理:将TXT行解析为数组

3
我想将一个TXT文件中的文本读入数组结构,以便在批处理文件中使用(目前是硬编码读取配置元素)。以下是一些说明/假设:
  1. TXT文件与BAT文件在同一目录下
  2. 只有两列需要解析,行数未知
  3. Col1和Col2数据可以包含空格,但不能包含特殊字符
  4. .TXT文件的格式/分隔符可以是方便此任务的任何内容: 例如:Col1 | Col2
我只是想要一些指导来帮助我入门。谢谢! Mark

2
@MarkPelletier:请参考这篇帖子。@其他人:假设有这个命令:set /A result=2+3。如你所知,批处理不支持数字变量,也没有任何内置的“数字”概念,因此存储在result变量中的数字5是一个“模拟”的数字还是一个“仿真”的数字?因为根据你的观点,它并不是一个“真正”的数字五! - Aacini
2
@rojo:我只想指出,当有人询问“批处理中的算术运算”时,没有人会回答:“批处理不支持数字或算术运算,虽然有办法模拟它们,比如set命令的/A开关”,但很多人坚持要澄清数组的问题。为什么?请注意,所有可以在“支持数组”的编程语言中实现的操作也可以在批处理中实现(以一种或另一种方式)。底线是:我不认为频繁澄清“批处理不支持数组”的有用性。 - Aacini
3
同意。我也不这么认为。这种迂腐的争论对于提问者想要解决的问题没有任何帮助。我理解你的不满。我也会因为那些评论“你应该使用Powershell”而感到失望,但他们从未解释为什么提问者应该使用Powershell。不,Bill_Stewart,Powershell并不是救世主。无论问题是什么,它都不总是答案。 - rojo
@Aacini,我认为指出批处理并没有真正的数组并不是卖弄学问。向经验不足的批处理程序员展示如何在批处理中模拟数组是很好的,但是包括警告它们实际上并不是真正的数组是适当的。你与数字的比较是无效的,因为批处理确实支持数值变量和算术运算。我不认为大多数人会接受任何其他语言声称提供数组,而实际上需要同名的连续编号变量。 - aphoria
@aphoria:这些讨论的问题在于它们基于“观点”,而非事实。在执行set /A num=2+3命令之后,存储在num中的5既不是16/32位整数,也不是单个BCD数字,因此“在我看来”它不是一个数字!那么这种情况下的事实是什么呢?大多数Microsoft网站指定:“环境变量是字符串...”,而Win-32 API参考更加精确:“环境块由...以null结尾的字符串组成,其中每个字符串的形式为:name=value”。字符串不是数字! - Aacini
显示剩余7条评论
1个回答

5

模拟一个二维数值索引数组:

textfile.txt的内容:

var 1,val 1
var 2,val 2
var 3,val 3

test.bat 内容:

@echo off
setlocal enabledelayedexpansion

set idx=0

for /f "usebackq tokens=1* delims=," %%I in ("textfile.txt") do (
    set "var[!idx!][0]=%%~I"
    set "var[!idx!][1]=%%~J"
    set /a idx += 1
)

set var

输出结果:

var[0][0]=var 1
var[0][1]=val 1
var[1][0]=var 2
var[1][1]=val 2
var[2][0]=var 3
var[2][1]=val 3

或者你可以模拟关联数组,如果你正在处理配置数据,那么它的键值对格式可能更有意义。

关联数组的模拟:

textfile.txt 的内容:

key 1=val 1
key 2=val 2
key 3=val 3

test.bat的内容如下:

@echo off
setlocal

for /f "usebackq tokens=1* delims==" %%I in ("textfile.txt") do (
    set "config[%%~I]=%%~J"
)

set config

输出结果:

config[key 1]=val 1
config[key 2]=val 2
config[key 3]=val 3

Rojo,这是一个很棒的开始!你的两种模拟变体都可以适用于我的需求。我会稍微调整一下,看看哪个更适合。如果有任何发现或调整,我会回报的。谢谢!- Mark - Mark Pelletier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接