枚举FOR / F语句的delims

时间:2012-02-07 19:29:17

标签: for-loop batch-file windows-xp enumerate

我有一个FOR / F语句,我希望它枚举命令解析的delim。例如:

FOR /F "delims=," %%A IN ("This,is,a,comma,delimited,sentence") DO (
    some command to enumerate delims
)
:OUT

我希望它能够说明该句中的每个分隔项目。在这种情况下,它将输出6

编辑:我知道很长一段路要检查每一个......但我试图避免这种方法:

IF %%A == [] SET enum=0 && GOTO:OUT
IF %%B == [] SET enum=1 && GOTO:OUT

3 个答案:

答案 0 :(得分:3)

没有办法直接枚举FOR / F“delims = ...”命令中的项目。通常的做法是通过循环计算一个项目,从句子中删除它并重复计算项目。

但是,根据特定的分隔符和句子中的其余字符,您可以使用FOR命令(没有/ F选项)来重复其代码,每个项目由标准批量分隔符分隔,即逗号,分号和等号,除了空格。在您的特定示例中:

SET ENUM=0
FOR %%A IN (This,is,a,comma,delimited,sentence) DO SET /A ENUM+=1

直接计算以逗号分隔的项目数。如果分隔符是逗号,分号或等号以外的字符,则可能的解决方案是三步法:

1- Replace spaces, comma, semicolon and equal-sign for another know character(s).
2- Replace the delimiter for any Batch standard delimiter (space, comma, etc).
3- Use a simple FOR to directly enumerate the items.

答案 1 :(得分:3)

有一种方法可以直接枚举FOR / F“delims = ...”命令中的项目 您只需要在字符串中插入一些换行符。

setlocal EnableDelayedExpansion
set LF=^


rem ** Two empty lines are required

set count=0
FOR /F "tokens=* delims=" %%a in ("item1!LF!item2!LF!item3") DO (
  set /a count+=1
  echo !count!: "%%a"
)
echo(
set "CSV=This,is,a,comma,delimited,sentence"
echo Or with comma separeted text: !CSV!
for %%L in ("!LF!") do set "CSV=!CSV:,=%%~L!"
set count=0
FOR /F "tokens=* delims=" %%a in ("!CSV!") DO (
  set /a count+=1
  echo !count!: "%%a"
)

答案 2 :(得分:2)

Aacini建议使用简单的FOR代替FOR / F是一个很好的解决方案,除非该字符串可能包含通配符*??字符可以通过搜索和替换来保护,但是没有有效的方法可以批量替换*

如果遇到通配符问题,则可以在循环中恢复使用FOR / F来一次解析一个单词。大多数人使用GOTO来完成循环,因为你无法知道你会找到多少单词。但GOTO相对较慢。通过使用具有任意大量项目的外部FOR循环(不是FOR / L),可以显着提高性能。在没有更多单词的情况下,您可以使用GOTO退出循环。如果循环没有耗尽,可以使用GOTO重新启动循环。一个包含100个项目的外部循环每100个已解析的单词只能执行1个GOTO。

@echo off
setlocal enableDelayedExpansion
set "str=This,is,a,comma,delimited,sentence"
set "L10=1 2 3 4 5 6 7 8 9 0"
:loop - The outer FOR loop can handle 100 words before a single GOTO is needed
for %%. in (%L10% %L10% %L10% %L10% %L10% %L10% %L10% %L10% %L10% %L10%) do (
  for /f "tokens=1* delims=," %%A in ("!str!") do (
    echo %%A
    if "%%B" == "" goto :break
    set "str=%%B"
  )
)
goto :loop
:break

与所有FOR循环一样,如果在扩展%% A变量时启用了延迟扩展,则必须担心!^的损坏。

FOR / L不应该用于外部循环,因为FOR / L总是完成对所有迭代的计数,即使你在体内使用GOTO也是如此。