批处理文件问题:如何将文本文件从带有感叹号的文件加载到全局数组中?

问题描述 投票:0回答:1

我的目标是将文本文件加载到全局数组中,并且该文件包含感叹号。然后,我想对数组进行冒泡排序,然后将内容保存到新文件中。不幸的是,我什至无法将数据加载到数组中。我尝试使用for循环,但似乎既需要延迟扩展又不需要延迟扩展。当然,由于setlocal命令,在循环内部进行的任何变量都是局部变量,对吗?因此,一旦达到endlocal(以切换延迟扩展),范围就消失了。我当时以为我需要使数组成为全局数组,以便以后可以继续对其进行操作。 (我尝试在endlocal的末尾添加set命令,以将局部值传递到更高的范围,但我的尝试无济于事。)

setlocal enabledelayedexpansion
set /a count=0
set "file=list.txt"

echo Extracting titles and IDs...

for /f "usebackq delims=; tokens=1,2* skip=1" %%a in ("%file%") do (
    set /a count+=1
    setlocal disabledelayedexpansion
    set "title=%%b"
    set "gameid=%%a"
    setlocal enabledelayedexpansion
    for /f "delims=- tokens=1,2*" %%x in ("!gameid!") do (
        echo %%y %%x "!title!"
        set "entry[!count!]=%%y %%x !title!"
    echo %count% - !count!
    )
    endlocal
    endlocal
)


pause

输入文件看起来像:

ID;Title;Other;Headings;We;Dont;Need
ABC-456;My second game ever! Even better!;foo;bar;blah;blah;blah
XYZ-123;My first game ever! Yes!;foo;bar;blah;blah;blah

我的最终目标是创建表单中的文件

123 XYZ "My first game ever! Yes!"
456 ABC "My second game ever! Even better!"

按数值排序后。如果有人可以帮助完成第一部分(将数据加载到数组中),将不胜感激。

arrays for-loop batch-file global-variables delayedvariableexpansion
1个回答
1
投票

当可以使用for变量时,可以通过不使用变量来完全避免延迟扩展。

唯一需要延迟扩展的位置,可以通过替代方法完成:

call set "entry[%%count%%]=%%Y %%X %%B"

call强制另一层扩展。为了使它正常工作,您必须确保%%var%%不会与%%var%%混淆。这就是原因,我将for变量更改为大写(%%a%%A不同)。

@echo off
setlocal disabledelayedexpansion
set /a count=0
set "file=list.txt"

echo Extracting titles and IDs...
for /f "usebackq delims=; tokens=1,2* skip=1" %%A in ("%file%") do (
    set /a count+=1
    for /f "delims=- tokens=1,2*" %%X in ("%%A") do (
        call set "entry[%%count%%]=%%Y %%X %%B"
    )
)
(for /f "tokens=1,* delims==" %%A in ('set entry[') do @echo %%B)|sort
pause

((注意:仅当所有项目都有一个三位数的数字时,排序才有效)

输出示例数据:

Extracting titles and IDs...
123 XYZ My first game ever! Yes!
456 ABC My second game ever! Even better!
© www.soinside.com 2019 - 2024. All rights reserved.