Как избежать экранирования символа ~ в пакетном скрипте? - PullRequest
1 голос
/ 24 мая 2019

Я пытаюсь заменить (~) в строке запятой (,), но использование (~) во время замены строки означает отображение всех символов из этого индекса (например,% a: ~ 2%).

Моя строка 1,2,3~4~5~6,7~8,9,10

Я уже пытался использовать каретку (^), которая не выполняет работу.

С помощью каретки (^) %a:^~=,% Я получаюэхо 1,2,3~4~5~6,7~8,9,10

без каретки (^) %a:~=,% Я получаю a:~=,

Ввод:

1,2,3~4~5~6,7~8,9,10

код:

SET a=1,2,3~4~5~6,7~8,9,10
SET a=%a:^~=,%
echo !a!

Ожидаемый вывод:

1,2,3,4,5,6,7,8,9,10

Фактический вывод:

a:~=, ИЛИ 1,2,3~4~5~6,7~8,9,10

Что такое управляющий символ для (~), поэтому яможно заменить его строкой?

РЕДАКТИРОВАТЬ: Добавить более подробную информацию о более широком проекте

У меня есть лист Excel, который содержит несколько ячеек, содержащих такие элементы, как data, data, этот лист Excel затем экспортируетсякак CSV, так что я могу перебирать данные.Когда преобразуется Excel, ячейки, содержащие data, data, преобразуются в "data, data".Я нашел обходной путь для сохранения этих данных как одной ячейки при итерации через .csv с запятыми (,), сначала просматривая строку в поисках двойных кавычек ("), и когда они были найдены, я беру данные в кавычкахи замените запятые (,) на тильды (~) и удалите двойные кавычки (").Это изменяет данные на data~ data.Затем я реформирую оригинальную линию с этим изменением.Позже я получаю доступ к данным на основе ввода от пользователя, говорящего мне, какой столбец данных они хотят.На этом этапе я хотел бы иметь возможность преобразовать тильды (~) обратно в запятые (,), чтобы возвращать данные в точности так, как они показаны в таблице Excel, то есть преобразование data~ data в data, data

Ответы [ 2 ]

0 голосов
/ 26 мая 2019

Невозможно экранировать символ ~, поэтому вы можете только обойти его.

А как насчет этого подхода:

@echo off
set "STR=1,2,3~4~5~6,7~8,9,10"
set "NEW=,"
:LOOP
if not defined STR goto :END
rem // Get part left from first `~`:
for /F "delims=~ eol=~" %%I in (",%STR%") do set "PRT=%%I"
set "PRT=%PRT:~1%"
rem // Get part right from first `~`:
set "CMP=%STR:*~=%"
if "%CMP%" == "%STR%" (set "STR=") else (set "STR=%CMP%")
rem // Replace a single `~` by `,`:
set "NEW=%NEW%%PRT%,"
goto :LOOP
:END
echo(%NEW:~1,-1%
0 голосов
/ 24 мая 2019

в настоящее время нет способа избежать тильды в партии, но есть некоторые обходные пути.

@echo off
set a=1,2,3~4~5~6,7~8,9,10
:start
for /f "tokens=1* delims=~" %%i in ("%a%") do set "a=%%i,%%j"
echo %a% | findstr "~">nul 2>&1
if %errorlevel% equ 0  goto start
echo %a%

Не уверен, что требуется расширение, поскольку это довольно очевидно?но буду рад объяснить при необходимости :)

...