GOOGLE ADS

воскресенье, 24 апреля 2022 г.

создание переменной json из данных txt файла в пакетном скрипте

У меня есть текстовый файл с вводом как -

First Line data here...
Second, line data; here
Third. line data here..,

У меня есть следующий код сценария bat для чтения txt файла построчно, и значение в переменной tmp в идеале должно выглядеть так:

{ "s1":"First Line data here...","s2":"Second, line data; here","s3":"Third. line data here..,"}

код сценария bat, который не дает мне ожидаемого результата, выглядит так:

@echo off
set /a count=1
set tmp=
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ data.txt"`) do (
set "var=%%a"
SETLOCAL EnableDelayedExpansion
set "var=!var:*:=!"
echo(!var!
call:processline!var!
ENDLOCAL
)
pause
goto:END
:processline
set txt="%*"
set inp="s%count%"
IF "!tmp!" EQU "" (
echo if called
set tmp=%inp%:%txt%
) ELSE (
echo else called
set tmp=%tmp%,%inp%:%txt%
)
set /a count+=1
exit /b 0
:END
echo end called
echo -------
echo %tmp%}
pause

после некоторой отладки я заметил, что строка «set tmp=%inp%:%txt%» на самом деле не устанавливается в глобальной области видимости и всегда остается пустой, как я могу изменить этот код, чтобы добиться желаемого вывода json в tmp?


Решение проблемы

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
rem The following settings for the source directory & filename are names
rem that I use for testing and deliberately include names which include spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.
SET "sourcedir=u:\your files"
SET "filename1=%sourcedir%\q71959582.txt"
SET "json="
FOR /F "usebackq tokens=1*delims=:" %%b in (`findstr /n. "%filename1%"`) do SET "json=!json!"s%%b":"%%c","
SET "json={ %json:~0,-1%}"
SET json

findstrПросто добавляет к каждой строке файла префикс serial:.

Анализирует for /fрезультирующую строку, помещает серийный номер %%bи оставшуюся часть строки после :in %%c.

Просто setдобавляется "s<serialnumber>":"<line contents>",к существующему значениюjson

Затем все, что требуется, это добавить фигурные скобки префикса и суффикса к построенному jsonзначению, все заблокирует терминал,

Причина, по которой ваш код не работал (я не пробовал, так что это теория), заключается в том, что setlocal/endlocalскобка внутри forцикла устанавливает локальную копию среды, манипулирует ею, а затем восстанавливает исходные значения при endlocalвыполнении.

Поскольку вы выполняете a setlocal enabledelayedexpansionв начале кода, delayedexpansionвключено, поэтому вам не нужно включать его снова. Ваш код может работать без исчезновения измененных значений, если вы просто удалите команды setlocalи endlocalиз forцикла.

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...