Splitter类函数总结

Splitter类函数即拆分器函数,为Table.SplitColumn的参数函数,共有如下9个。

函数名解释类型
Splitter.SplitByNothing返回不拆分且将其自变量作为单元素列表返回的函数。
Splitter.SplitTextByAnyDelimiter返回一个函数,它在任意指定的分隔符处将文本拆分为文本列表。按分隔符
Splitter.SplitTextByDelimiter返回一个函数,它根据指定的分隔符将文本拆分为文本列表。按分隔符
Splitter.SplitTextByEachDelimiter返回一个函数,它依次在每个指定的分隔符处将文本拆分为文本列表。按分隔符
Splitter.SplitTextByLengths返回一个函数,它按每个指定的长度将文本拆分为文本列表。按字符数
Splitter.SplitTextByPositions返回一个函数,它在每个指定的位置将文本拆分为文本列表。按字符数
Splitter.SplitTextByRanges返回一个函数,它根据指定的偏移量和长度将文本拆分为文本列表。按字符数
Splitter.SplitTextByRepeatedLengths返回一个函数,它在指定的长度后反复将文本拆分为文本列表。按字符数
Splitter.SplitTextByWhitespace返回一个函数,它在空白处将文本拆分为文本列表。

通过观察以上的说明可以发现,返回的都是将文本拆成list的函数,其本质就是each {}的形式,只不过用了这些看起来更加专业的拆分器函数。
由于数量较多,还是结合界面操作来讲。可以分为3类,第一类是按分隔符,第二类是按字符数或者说叫按位置,第三类即Splitter.SplitByNothingSplitter.SplitTextByWhitespace,暂且就分为没什么卵用类吧。

先看自动生成的公式,比如选按逗号分隔,拆分位置为"最左侧的分隔符",主要看splitter的部分:
Splitter.SplitTextByEachDelimiter({","}, QuoteStyle.Csv, false)

 
共三个参数,第一参数为指定的分割符,这个一会再讲;第二参数为QuoteStyle.Type,有两个参数可选分别为QuoteStyle.NoneQuoteStyle.Csv,可以分别用0和1代替。也就是下图界面中的"引号字符"选项,实际上并没有什么卵用,一般可以省略。

 
第三参数为靠左还是靠右,false为靠左,true为靠右,也就是上图中"最左侧的分隔符"和"最右侧的分隔符"的区别。
= Table.SplitColumn(源, "成绩",Splitter.SplitTextByEachDelimiter({","},null,true))

 
下面开始一个个过,先看第一类按分隔符。有三个函数,其中ByDelimiter只有两个参数,没有最后一个靠左靠右模式的参数,第一参数为text。ByAnyDelimiter和ByEachDelimiter都有三个参数,第一参数都为list。
ByDelimiter就是只指定一个分隔符,全部按这个分隔符拆,遇到就拆,这个不难理解。
ByAnyDelimiter则是上一个的加强版,也是见一次拆一次,但是它的第一参数可以以list的形式指定多个分隔符,比如{","," "}就是遇到逗号和空格都拆。但它竟然也有第三参数的靠左靠右模式,反正我是想不通有什么存在的意义,暂且省略不填吧。
ByEachDelimiter第一参数也是list,但不同的是列表中的每个分隔符都是指定位置的。你可以想象成在纸上把列表中的分隔符都写出来,比如{","," "},那么遇到第一个逗号进行一次拆分,然后把逗号划掉,后面再遇到就不拆了,再找下一个分隔符继续拆分。此时的第三参数就有意义了,填true和false决定了是按从左还是从右的顺序开始找分隔符。
 
再看第二类按字符数拆分,发现区别不大,拆分函数变了Splitter.SplitTextByRepeatedLengths(3),又试一下靠左模式,Splitter.SplitTextByPositions({0,3},false)

 
第一参数就是第一节拆分出来的字符串的位置边界,尝试改改这个边界:Splitter.SplitTextByPositions({2,6},false)

 
再试下Splitter.SplitTextByPositions({0,3,6,9},false))

让我想到菜市场卖肉的师傅说:指哪儿切哪儿。。。
 
Splitter.SplitTextByLengths({3,3,3,99},false)表示不服!你有我够直接吗?

 
还有一个Splitter.SplitTextByRanges没讲到,Splitter.SplitTextByRanges({{0,3},{3,6}},false)

语法为{{初始点1,长度1},{初始点2,长度2},...}
 
至于第三类没什么卵用类的Splitter.SplitTextByWhitespaceSplitter.SplitByNothing,我是真的暂时还没发现它们有什么卵用。。。
当然,spiltter类函数不仅只能作为Table.SplitColumn的参数,也可以拿出来单独使用,如果我们在编辑栏填上参数:

可以看到返回的还是一个函数,那我们在后面再次给一个list参数,就能够按照指定的规则将文本分割:
= Splitter.SplitTextByLengths({5,5,3})("powerquery爱好者")

5 Replies to “Splitter类函数总结”

  1. 目前我碰到一個問題是:我由SAP系統下載一個報表檔案,在還沒切割成個欄位時,每筆資料長度均為165 bytes。但資料中有英文,也有中文字(2 bytes)。以長度切割時,Power Query視一個中文字及一個英文字母都是1,無法照我想要的方法Split。不知道你是否有更好的方法Split夾雜中英文的資料??

  2. ByAnyDelimiter在下面的情況出來就有分別了, 可是沒搞懂為啥true的時候"E1,E2,E3"從右邊開始E3就不見了?
    我試過獨立只用D的行是會出3列的,可是ABCD 4行做的話就只有2列了

    let
    Source = #table({"Name", "Score"},{{"A","C1,C2,""C3;3"";4"""}, {"B","C1,""C2,C3"""}, {"C","""D1,D2"",D3"}, {"D","E1,E2,E3"}}),
    #"startatend is false" = Table.SplitColumn(Source, "Score", Splitter.SplitTextByAnyDelimiter({",", ";"}, QuoteStyle.Csv, false)),
    #"startatend is true" = Table.SplitColumn(Source, "Score", Splitter.SplitTextByAnyDelimiter({",", ";"}, QuoteStyle.Csv, true))
    in
    #"startatend is true"

    1. Source = #table({"Name", "Score"},{{"D","E1,E2,E3"},{"A","C1,C2,""C3;3"";4"""}, {"B","C1,""C2,C3"""}, {"C","""D1,D2"",D3"}})

      把Source改成D先走的話就出來的, 看來是以第一行拆分出來的列數來判定的
      不然就自己加參數
      #"startatend is true" = Table.SplitColumn(Source, "Score", Splitter.SplitTextByAnyDelimiter({",", ";"}, QuoteStyle.Csv, true),3)

  3. 拆分函数主要用于有间隔符、长度、位置有规律的,如果是复杂的需要嵌套运算或者PowerQuery支持Js的正则表达式,专业拆分和提取

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注