首页 > 解决方案 > 批处理数组、关联数组以及如何在数组中导航

问题描述

如何批量调用多级数组?

我想创建一个具有多个数据的唯一值数组,然后在取消这些值之后我将设法创建一个关联数组。

我有一个具有很多价值的 csv 文件,如下所示:

R14201;03h22mn55s;profile;15;
R14201;03h23mn02s;profile,15;
R14201;03h23mn07s;home;15;
R14202;03h23mn12s;profile;12;
R14201;03h23mn16s;home;14;
R14203;03h23mn19s;profile;15;
R14203;03h23mn22s;profile;11;
R14201;03h23mn25s;profile;15;
R14204;03h23mn31s;profile;12;
...

我想做的事 :

1 - 获取 RXXX 的唯一参考(成功)

2 - 查看第三列中的更改,仅更改及其顺序

3 - 查看最后一列的不同值

所以最后,欲望状态将是:

R14201 : [profile, home, profile], [15, 14]
R14202 : [profile], [12]
R14203 : [profile], [15, 11]
R14204 : [profile], [12]

就变量而言,我会有类似的东西:

myArray[R14201].NAME=R14201
myArray[R14201].PROFILE[0]=profile
myArray[R14201].PROFILE[1]=home
myArray[R14201].PROFILE[2]=profile
myArray[R14201].NUMBER[0]=15
myArray[R14201].NUMBER[1]=14


myArray[R14202].NAME=R14202
myArray[R14202].PROFILE[0]=profile
myArray[R14202].NUMBER[0]=12

myArray[R14203].NAME=R14203
...

编辑 :

在逻辑方面,我认为我将有 2 个数组:我的关联数组和另一个访问我的关联数组:

myIteratorArray[0]=R14201
myIteratorArray[1]=R14202
myIteratorArray[2]=R14203
myIteratorArray[3]=R14204
...
myArray[R14201].NAME=R14201
myArray[R14201].PROFILE[0]=profile
...

现在我只是想批量理解和设置我的数组,我在 3 天前学习了语言。

但事实是:我知道 EnableDelayedExtension 可以使用 2 个叠瓦变量,但我不知道是否可以有 3 个或更多叠瓦变量。

感谢Aacini这篇文章中,我设法理解了很多关于批量数组的东西。

在下面的代码中,进入第二个,我不知道如何调用变量。

@echo off
setlocal EnableDelayedExpansion

set i=0
for %%d in (R14201 R14201 R14201 R14202 R14201 R14203 R14203 R14201 R14204) do (
    :: Here I see if myArray[RXXX] is defined
    if not defined myArray[%%d] (
        set /A i=i+1
        set myArray[%%d]=x!i!
        :: Here I set an other array in order to loop on this array, to call myArray[RXXX]
        :: I will call myArray[RXXX] and RXXX will be stored in myIteratorArray[x].
        :: I am sure that myIteratorArray[x] will contain unique value thanks to the if condition
        set myIteratorArray[!i!]=%%d
    )
)

set numberOfJu=%i%

for /L %%i in (1, 1, %numberOfJu%) do (
    ::here the problematic call
    echo !myArray[!myIteratorArray[%%i]!]!
)

这是我的问题:

1 - 如何调用具有多个叠瓦变量的变量,例如 myArray[myIteratorArray[myIndex]] ?

2 - 为了成功,您如何看待我的逻辑?

3-您认为可以批量执行此操作吗?我对语言别无选择。

提前致谢 !

标签: batch-filearraylistcmdlogicdelayedvariableexpansion

解决方案


当需要延迟扩展访问的变量由额外的延迟变量组成时,可以使用额外的for循环访问子变量:

for /L %%i in (1, 1, %numberOfJu%) do For /f "Delims=" %%u in ("!myIteratorArray[%%i]!") do (
    echo !myArray[%%u]!
)

至于用每个唯一值定义数组,在定义过程中将其添加到数组之前,可以使用 findstr 搜索数组的相关组以查找该值的存在。

有关批量处理关联数组的高级示例,请参见此处 以上是批处理 RPG 游戏的模板,它使用关联数组来处理与库存相关的所有事项,每个项目都有相关的值,例如价值、重量 dmg/防御等通过迭代#Equipped 组来更改项目时更新。

下面是一个简短的脚本,演示了如何定义一个可以被搜索findstr以实现有序输出的数组:

@Echo off & Cd /d "%~dp0"

 Setlocal EnableDelayedExpansion
:# replace 'source.csv' with the path to your csv file
 For /F "Delims=" %%G in (Source.csv)Do For /F "Tokens=1,3,4 Delims=;," %%1 in ("%%G")Do (
  Echo(!$Refs!|%__APPDIR__%Findstr.exe /c:"%%1" > nul || (
   Set "$Refs=!$Refs! %%1"
  )
  Set /A "%%1[i]+=1"
 rem compare last defined [reference]
  For /f "Delims=" %%v in ('Set /A "!%%1[i]!-1"')Do (
   If not "!Ref[%%1][%%v]!"=="%%3" (
    Set /A "[i]+=1"
    Set "Ref[%%1][!%%1[i]!]=%%3"
    Set /A "Ref[%%1]+=1"
    Set "$Ref[![i]!]%%1[!Ref[%%1]!].%%2=%%3"
   ) Else (
    Set /A %%1[i]-=1
 )))

 For %%G in (!$Refs!)Do For /f "Tokens=1,2 Delims==" %%H in ('Set $Ref[ ^| %__APPDIR__%findstr.exe /c:"%%G"')Do (
  For /F "Tokens=2 Delims=." %%1 in ("%%H")Do Echo(Reference: %%G type: %%1 value:%%I
 )

示例输出:

Reference: R14201 type: profile value:15
Reference: R14201 type: home    value:14
Reference: R14201 type: profile value:15
Reference: R14202 type: profile value:12
Reference: R14203 type: profile value:15
Reference: R14203 type: profile value:11
Reference: R14204 type: profile value:12

推荐阅读