2017-05-16 46 views
0

我想分割一个字符串(用'|'或','分隔的分隔字符串)。我用fn:tokenize来实现这个。考虑下面的示例文本,其中我有4列文本,其中第3列中的值与分割模式的值相同。如何跳过拆分功能相同的FN分割模式值:tokenize

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

上面的代码的结果是给我5个值,其中2是空的:

column1 
column2 


column4 

我还试图与添加引号栏3值,这也是不给我的预期结果。

+0

对我来说,上面看起来像5列的分隔字符串,因为你有4个管道符号。这不正确吗? – grtjn

+0

不,这是一个4列的字符串。在第三列中,我将管道符号作为一个值。在这第三列我面临这个问题。 – user3463568

+0

好的,清楚。是的,标记化是不够的。您需要一个递归解决方案来剔除比特位,并预计引用值中存在管道符号。 – grtjn

回答

0

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

0

除了fn:tokenize按正则表达式分割,因此要求|被转义,这似乎是一个可怕的数据格式。除了Michael Kay指出的问题,并预期||将始终指示一个以|开头的新字段,并且从不会有空列,您可以应用简单的黑客攻击并用另一个字符替换管道符号,然后再转换回来。不过,这要求你在数据集中不允许的Unicode范围内找到一些字符。

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

结果:

column1 
| 
| 
column4 

我如果不适用你的使用情况的假设,你将不得不决定另一套类似严格的假设能够解析您的内容。