【问题标题】:"delims=#+#" - more then 1 character as delimiter"delims=#+#" - 超过 1 个字符作为分隔符
【发布时间】:2015-09-21 08:04:59
【问题描述】:

是否可以定义不限于 1 个字符的分隔符?根据标题的示例,我想将分隔符定义为例如 '#+#'。文本文件/行可以同时包含这两个字符,但您遇到特定子字符串/文本组合的可能性很小。

【问题讨论】:

  • for 的分隔符?不,只有单个字符是可能的。 csv 的分隔符?据我所知,Excel 也只支持单字符分隔符

标签: windows batch-file cmd


【解决方案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 的原因。

由于我们正在进行字符串替换,并且可能以仅由分隔符组成的字符串结尾,因此内部fordo子句可能不会被执行,因此最终的if包括在内以确保取消enabledelayedexpansion

【讨论】:

  • ...关于最后的endlocal:所以for 设置ErrorLevel 如果它的主体从未被执行?
  • @aschipfl,不,它没有设置 errorlevel 变量,但在cmd 中,大多数命令都被编码为返回退出成功的函数/失败值,条件执行运算符使用此值来确定代码执行。如果for /f 没有遍历任何行,则其关联函数将返回失败代码但不会设置errorlevel。您可以在this question 中找到有关此行为的更多信息。至少阅读 dbenham、eryksun 和我自己的答案的答案(这是逻辑顺序)。
  • #MC ND:这就是谦逊的感觉 :) 这就是说:对我自己/IT 团队来说太复杂了。使用 ASCII_ANSI 进行了一些测试,可能是以下几行:@echo off rem *** ASCII Alt+221 set MyDelim=¦ dir . /b >dirlist.txt Setlocal EnableDelayedExpansion set Count=testingValue for /f "tokens=*" %%i in (dirlist.txt) do (set AddValue=%%i%MyDelim%%Count% echo [!AddValue!]) 暂停
  • @Badt_Paul,抱歉,我确实遗漏了一些东西,但我看不出问题(询问如何拆分数据)与您评论中的代码之间有明确的关系。它是否试图生成稍后您必须拆分的数据?
  • 目标是确保分隔符始终有效;是独特的。因此,一个 multi_char 分隔符将是解决方案。由于这是不可能的,下一个“最好的事情”将是使用几乎/根本不使用的分隔符。我(可以)控制分隔符,而不是它的内容。但生成的文件是“纯”ASCII(目前不是 UTF)。所以回答你的问题:我收到了分隔文件,然后我需要“拆分”。
【解决方案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

【讨论】:

  • 我正要问这是否可以扩展到多个 (3+) 分隔值,但您的链接显示了这样的示例。还没有测试它,但这确实是我一直在寻找的。 (我也承认我无法解释为什么这是有效的......)
  • @Badt_Paul:如果您想查看此方法的另一个示例并进行更多解释,请参阅:stackoverflow.com/questions/32578014/…
  • 奇怪的是,当您只是将逻辑放在括号之间时,这个巧妙的技巧似乎不起作用 ( set "str= ... echo last :[%last%] ) ...
  • @RKO:是的,但这是%variable% 扩展的固有限制:( set "var=Not works" & echo %var% )。你可以EnableDelayedExpansion 然后使用( set "var=Works" & echo !var! )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多