Можно ли определить разделитель, который не ограничен 1 символом? Основываясь на примере названия, я хотел бы определить мой разделитель, например. '# + #'. Текстовые файлы/строки могут содержать оба символа, но есть очень мало шансов, что вы столкнетесь с этой конкретной подстрокой/текстовым комбо."delims = # + #" - более 1 символа в качестве разделителя
ответ
Нет, вы не можете использовать строку в качестве разделителя в оговорке delims=
. Конечно, вы можете включить строку, но она будет обрабатываться как набор отдельных символов, которые будут использоваться как разделители, а не как строка разделителя.
Если вам действительно нужно разбить на строки, самый быстрый подход мог бы заменить разделитель строки персонажем, не включенных в данные и использовать этот символ в качестве разделителя
@echo off
setlocal enableextensions disabledelayedexpansion
for /f "delims=" %%a in ("this is a +test!! #+# of string #splitting#") do (
set "buffer=%%a"
setlocal enabledelayedexpansion
(for /f "tokens=1,2 delims=¬" %%b in ("!buffer:#+#=¬!") do (
endlocal
echo full line : [%%a]
echo first token : [%%b]
echo second token : [%%c]
)) || if "!!"=="" endlocal
)
Примечание : setlocal enabledelayedexpansion
необходим, чтобы читать переменную, измененную внутри цикла for
, получая данные (здесь имитируется непосредственно, включая строку). Затем внутри цикла for
, который токенизирует прочитанную строку, замедленное расширение отключается, чтобы избежать проблем с символами !
(если активное приложение с задержкой активно, они будут потребляться синтаксическим анализатором). Это является причиной для endlocal
внутри цикла.
Как мы делаем замену строки и можно закончить со строкой, состоящей только из разделителей, возможно, что положение внутреннего for
do
не будет выполнено, поэтому окончательный if
включен для того, чтобы enabledelayedexpansion
отменен.
... относительно окончательного 'endlocal': поэтому' for' устанавливает 'ErrorLevel', если его тело никогда не выполняется? – aschipfl
@aschipfl, нет, он не * устанавливает * переменную 'errorlevel', но в' cmd' большинство команд кодируются как функции, которые возвращают значение sucess/failure exit, а оператор условного выполнения использует это значение для определить выполнение кода. Если 'for/f' не выполняет итерацию по какой-либо строке, ее асоциальная функция вернет код сбоя, но не установит' errorlevel'. Дополнительную информацию об этом поведении можно найти в [этом вопросе] (http://stackoverflow.com/q/30714985/2861476). Прочтите хотя бы ответы (это логический порядок) от dbenham, eryksun и моего собственного ответа. –
#MC ND: так вот как выглядит смирение :) Вот так: способ усложнить для себя/ITteam. Совершено некоторое тестирование с ASCII_ANSI, и, вероятно, что-то есть эти строки:. @echo от бэр *** ASCII Alt + 221 набор MyDelim = | реж */б> dirlist.txt SETLOCAL EnableDelayedExpansion набор граф = testingValue для/f "tokens = *" %% i in (dirlist.TXT) сделать ( набор AddValue = %% я% MyDelim %% Count% эхо [! AddValue] ) пауза –
Недавно я обнаружил интересный трюк, который позволяет использовать многосимвольную строку как разделитель, чтобы разделить большую строку очень простым способом; метод не использует команду for
, но выполняет разделение только в одной строке! Вот оно:
@echo off
set "str=this is a +test!! #+# of string #splitting#"
set "first=%str:#+#=" & set "last=%"
echo full line : [%str%]
echo first token : [%first%]
echo last token : [%last%]
Этот метод также позволяет разделить большой строку на несколько частей и сохранить все они в массиве. Дополнительная информация: dos batch iterate through a delimited string
Я собирался спросить, может ли это быть расширено до нескольких (3+) разделенных значений, но ваша ссылка показывает такой пример. Еще не проверял, но это действительно то, что я искал. (Я также признаюсь, что не могу объяснить, почему это работает ...) –
@Badt_Paul: Если вы хотите просмотреть другой пример этого метода с дополнительными пояснениями, см. Http://stackoverflow.com/questions/32578014/how -в-приточно-версия номер-в-окна-пакетный файл/33112178 # 33112178 – Aacini
- 1. Использование символа трубы в качестве разделителя полей
- 2. Использование разделителя в качестве разделителя
- 3. Почему имя символа [1] может содержать более 1 символа?
- 4. Twig разделил строку после первого символьного символа в качестве разделителя
- 5. Использование символа процента в пакетном файле разделителя токенов
- 6. Разбивает строку, используя более чем один символ в качестве разделителя
- 7. выключатель не распознает более 1 символа
- 8. Поддерживается символ neo4j SOH в качестве разделителя?
- 9. Использование пробела в качестве разделителя
- 10. set "\ x3b" в качестве разделителя
- 11. Использование символа звездочки как разделителя сканера Java
- 12. Расщепление строка («_» в качестве разделителя)
- 13. hive using § в качестве разделителя
- 14. Преобразование запятой в качестве разделителя
- 15. Python: Разделить на 1 или более вхождений разделителя
- 16. Разделить текст на 4 символа без разделителя
- 17. Как читать строку более 1 символа за один раз
- 18. Невозможно использовать "." в качестве разделителя в antlr4
- 19. Избегайте пунктуации в качестве разделителя в списке
- 20. установить компонент UIPickerView в качестве разделителя
- 21. Extract часть строки до разделителя символа "/"
- 22. Синтаксический строку, содержащую # в качестве разделителя
- 23. Добавление разрыва строки в качестве разделителя
- 24. Возможно изменение символа разделителя пути встраиваемых ресурсов?
- 25. Разбиение строки запятой в качестве разделителя
- 26. Строка в качестве разделителя для `paste` команды
- 27. Даты чтения с периодом в качестве разделителя
- 28. Каков наилучший алгоритм для произвольной обработки символа-разделителя/escape-символа?
- 29. Используйте период в качестве разделителя в PHP
- 30. Добавить более 1 разделитель в TStringList
Разделитель для 'for'? Нет, возможны только отдельные символы. Разделитель для 'csv'? Насколько я знаю, Excel поддерживает только одиночные разделители символов – Stephan