2015-09-21 3 views
2

Можно ли определить разделитель, который не ограничен 1 символом? Основываясь на примере названия, я хотел бы определить мой разделитель, например. '# + #'. Текстовые файлы/строки могут содержать оба символа, но есть очень мало шансов, что вы столкнетесь с этой конкретной подстрокой/текстовым комбо."delims = # + #" - более 1 символа в качестве разделителя

+0

Разделитель для 'for'? Нет, возможны только отдельные символы. Разделитель для 'csv'? Насколько я знаю, Excel поддерживает только одиночные разделители символов – Stephan

ответ

4

Нет, вы не можете использовать строку в качестве разделителя в оговорке 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 внутри цикла.

Как мы делаем замену строки и можно закончить со строкой, состоящей только из разделителей, возможно, что положение внутреннего fordo не будет выполнено, поэтому окончательный if включен для того, чтобы enabledelayedexpansion отменен.

+0

... относительно окончательного 'endlocal': поэтому' for' устанавливает 'ErrorLevel', если его тело никогда не выполняется? – aschipfl

+0

@aschipfl, нет, он не * устанавливает * переменную 'errorlevel', но в' cmd' большинство команд кодируются как функции, которые возвращают значение sucess/failure exit, а оператор условного выполнения использует это значение для определить выполнение кода. Если 'for/f' не выполняет итерацию по какой-либо строке, ее асоциальная функция вернет код сбоя, но не установит' errorlevel'. Дополнительную информацию об этом поведении можно найти в [этом вопросе] (http://stackoverflow.com/q/30714985/2861476). Прочтите хотя бы ответы (это логический порядок) от dbenham, eryksun и моего собственного ответа. –

+0

#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] ) пауза –

2

Недавно я обнаружил интересный трюк, который позволяет использовать многосимвольную строку как разделитель, чтобы разделить большую строку очень простым способом; метод не использует команду 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

+0

Я собирался спросить, может ли это быть расширено до нескольких (3+) разделенных значений, но ваша ссылка показывает такой пример. Еще не проверял, но это действительно то, что я искал. (Я также признаюсь, что не могу объяснить, почему это работает ...) –

+0

@Badt_Paul: Если вы хотите просмотреть другой пример этого метода с дополнительными пояснениями, см. Http://stackoverflow.com/questions/32578014/how -в-приточно-версия номер-в-окна-пакетный файл/33112178 # 33112178 – Aacini

Смежные вопросы