我在 Qlik 中输入以下结构,包括两列。第一列(索引)包含顺序递增的数字,而需要转换的第二列由一系列由字符(在我的例子中为空格)分隔的字符串组成。
我的目标是实现一个转换,其中对于每个索引,第二列中的每个字符串都会重复。
为了说明这一点,请考虑以下使用书籍章节和单词的示例。第二列包含一本书的所有单词:
输入:
输出:
我想强调的是,挑战在于在此转换过程中处理第二列中的多个字符串。创建一个包含与各个字符串对应的列的中间表是不可行的,因为可能有数百个字符串。
SubField()
函数 来实现此目的,该函数可以让您通过分隔符分割字符串。通常,您还可以指定要返回哪个nth子字符串,但在数据加载编辑器中,您实际上可以忽略该参数,这将返回新记录中的每个子字符串。
这是您可以使用的脚本:
[data]:
Load
[Index]
, SubField([Col], ' ') as NewCol
Resident [data load];
按您需要的方式返回数据:
实现此目的的类似方法是使用 SubStringCount()
子句添加
IterNo()
函数和
while
函数。组合使用这些元素允许您迭代给定行,为每次迭代创建一个新行。
给出这个例子:
[data]:
Load
[Index]
, SubField([Col], ' ', IterNo()) as NewCol
Resident [data load]
While IterNo() <= SubStringCount([Col], ' ') + 1
;
...我们是说,我们想要迭代给定行的次数与该行的
' '
字段中出现的空格字符 [Col]
一样多。我们将 1
添加到该表达式中,因为我们假设总是比空格多一个子字符串。 IterNo()
函数返回当前迭代次数,因此我们将其用作 field_no 参数的参数。
因此,由于
We went tiptoeing
中有两个空格,我们对该行循环 2+1 次,每次迭代如下所示:
SubField( 'We went tiptoeing' , ' ', 1)
=We
SubField( 'We went tiptoeing' , ' ', 2)
=went
SubField( 'We went tiptoeing' , ' ', 3)
=tiptoeing