Вопрос о пакетном файле: Как загрузить текстовую таблицу из файла (с восклицательными знаками) в глобальный массив? - PullRequest
0 голосов
/ 31 октября 2019

Моя цель - загрузить текстовый файл в глобальный массив, и этот файл содержит восклицательные знаки. Я хочу затем отсортировать массив пузырьком и сохранить содержимое в новый файл. К сожалению, я даже не могу получить данные о загрузке в массив. Я пробовал использовать циклы for, но кажется, что отложенное расширение необходимо и не нужно. Конечно, любые переменные внутри циклов являются локальными переменными из-за команды setlocal, верно? Таким образом, как только достигается endlocal (для переключения отложенного расширения), область действия исчезает. Я думал, что мне нужно, чтобы массив был глобальным, чтобы я мог продолжить манипулировать им позже. (Я пытался добавить команды set в конце endlocal для передачи локальных значений в более высокую область, но мои попытки ни к чему не привели.)

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!"

после сортировки по числовым значениям. Если бы кто-то мог помочь просто пройти первую часть (загрузка данных в массив), это было бы очень полезно.

1 Ответ

1 голос
/ 31 октября 2019

Вы можете избежать отложенного расширения полностью, не используя переменные, когда вы можете использовать for переменные.

Единственное место, которое потребует отложенного расширения, может быть сделано альтернативой:

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

call вызывает другой уровень расширения. чтобы это работало должным образом, вы должны убедиться, что %%var%% не перепутает с %%v и ar%%. По этой причине я изменил переменную 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!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...