【问题标题】:How to skip the split functionality for same value of split pattern in fn:tokenize如何在 fn:tokenize 中跳过相同拆分模式值的拆分功能
【发布时间】:2017-05-16 09:58:25
【问题描述】:

我正在尝试拆分字符串(使用 '|' 或 ',' 分隔的分隔字符串)。我使用 fn:tokenize 来实现这一点。考虑下面的示例文本,其中我有 4 列文本,其中在第 3 列中我得到了与拆分模式相同的值。

fn:tokenize("column1|column2|||column4", "|")

上述代码的结果是 5 个值,其中 2 个为空:

column1
column2


column4

我还尝试在 column3 值中添加引号,这也没有给我预期的结果。

【问题讨论】:

  • 对我来说,上面看起来像是 5 列的分隔字符串,因为您有 4 个管道符号。对不对?
  • 不,它是一个 4 列的字符串。在第三列中,我将管道符号作为值。在这第 3 列中,我面临着这个问题。
  • 好的,清楚。是的,标记化是不够的。您将需要一个递归解决方案来消除位,并预期引用值中存在管道符号..
  • 您需要更准确地指定问题。例如||||| 一列包含|||,还是两列包含|?在我看来,这是一种设计不佳的数据语法。

标签: xquery marklogic stringtokenizer


【解决方案1】:

在 MarkLogic 9 中,您可以定义自己的自定义标记器。

【讨论】:

    【解决方案2】:

    除了fn:tokenize 被正则表达式拆分并因此需要对| 进行转义之外,这似乎是一种可怕的数据格式。抛开 Michael Kay 指出的问题并期望|| 将始终指示以| 开头的新字段,并且永远不会有空列,您可以应用一个简单的技巧并将管道符号替换为另一个字符,然后转换回来然后。不过,这需要您在数据集中不允许的 Unicode 范围内找到一些字符。

    for $token in fn:tokenize(fn:replace("column1|||||column4", "\|\|", "|_"), "\|")
    return fn:replace($token, "_", "|")
    

    结果:

    column1
    |
    |
    column4
    

    如果我所做的假设不适用于您的用例,您将必须确定另一组类似的严格假设才能解析您的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-08
      • 2016-02-26
      • 2019-07-19
      • 1970-01-01
      • 1970-01-01
      • 2021-06-17
      • 2013-05-02
      • 2010-11-05
      相关资源
      最近更新 更多