Получить подстроку с помощью / f разделителей и сохранить все символы разделителя - PullRequest
0 голосов
/ 17 января 2019

Я должен использовать пакет для извлечения подстроки из строки. Я немного погуглил, похоже, что использование / f delims - это путь, но я застрял, delims также удаляет все символы разделителя (=;) в строке.

SET STRING={"Building":{"type":"String","value":"Suite=123:638.way;PC=777;Contact Number=019553;"}}
FOR /f "tokens=4,5 delims=:" %%a in ("%STRING%") do (
  set SUBSTRG=%%a
  set SUBSTRG2=%%b
)
echo %SUBSTRG% %SUBSTRG2%

Я хочу извлечь подстроку "" Suite = 123: 638.way; ПК = 777; Контактный номер = 019553; "из STRING. Но используя разделители, как указано в коде, я получил "Suite 123638.way PC 777 Contact Number 019553 "}} У меня очень мало знаний в пакетной команде, как я могу это исправить? Есть ли лучший способ, чем использовать / f delims?

1 Ответ

0 голосов
/ 17 января 2019

Да, я бы не использовал цикл for /f для этого. Я твердо верю в использование парсера, который понимает структуру при очистке любого вида структурированных данных - парсера XML для данных XML, парсера JSON для данных JSON и так далее. Так что я бы с большей вероятностью использовал для этого PowerShell или JScript, чем чистый Batch. Вот пример гибридного сценария Batch + PowerShell, который демонстрирует:

<# : batch portion
@echo off & setlocal

set JSON={"Building":{"type":"String","value":"Suite=123:638.way;PC=777;Contact Number=019553;"}}

for /f "delims=" %%I in (
    'powershell -noprofile "iex (${%~f0} | out-string)"'
) do set "value=%%~I"

echo Scraped value: %value%
exit /b

: end Batch / begin PowerShell #>
add-type -AssemblyName System.Web.Extensions
$JSON = new-object Web.Script.Serialization.JavaScriptSerializer
$obj = $JSON.DeserializeObject($env:JSON)
$obj.Building.value

Этот метод будет более устойчивым к пространственным аномалиям, порядку переменных и т. Д., Поскольку вы извлекаете значение "value" по иерархии объектов, а не в виде простого текста.

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

@echo off & setlocal

set JSON={"Building":{"type":"String","value":"Suite=123:638.way;PC=777;Contact Number=019553;"}}

rem // Step 1: Strip everything before and including value":"
set "str=%JSON:*value":"=%"

rem // Step 2: Strip everything after and including the next quotation mark
set str=%str:"=&rem;%

rem // Step 3: output result
echo Scraped value: %str%

Это проще и очень эффективно, но это также сильно зависит от ваших данных, которые, как ожидается, поддерживают тот же порядок и интервал. Это более хрупко, чем использование парсера JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...