你會用PowerQuery統計字符串中各類字符出現的次數嗎?

很多時候我們需要統計單個字符或某種字符出現的次數,那麼在PowerQuery中怎麼實現呢?

你會用PowerQuery統計字符串中各類字符出現的次數嗎?

01統計字符串中單一字符出現的次數

有小夥伴提了一個問題:“PowerQuery是否有直接統計字符串中指定字符個數的函數”,我翻了下PowerQuery參考,並沒有找到這樣的一個函數。

那有沒有法子用PowerQuery來實現統計字符串中特定字符的出現個數呢?我目前知道的有兩種方法(假設要統計字符串【1-2-3-9】中【-】出現的次數):

= List.Count(Text.PositionOf("1-2-3-9","-",Occurrence.All))


= Text.Length("1-2-3-9")-Text.Length(Text.Replace("1-2-3-9","-",""))


兩種方法殊途同歸,不過我覺得方法一更“優雅”一些。

那還會不會有第三種方法呢?

更進一步,我們可以在這個例子的基礎上進行延伸和拓展。


02統計字符串中出現的數字個數

統計字符串【1-2-3-9】中【數字】出現的次數:

= List.Count(Text.PositionOfAny("1-2-3-9",{"0".."9"},Occurrence.All))

但是如果要統計字符串【李四5676中華234大家庭】中數字出現的次數,則結果就不對:

= List.Count(Text.PositionOfAny("李四5676中華234大家庭",{"0".."9"},Occurrence.All))

上面統計的結果是7,但是我們想要的結果是2。原因在於上面的代碼是把【5676】這一個數字作為四個數字統計了四次,實際上我們需要的是把【5676】作為一個整體統計一次。

那要如何才能得到正確結果呢?這時就必須藉助於自定義函數,比如下面這個:


(str as text)=>let

源 = Text.PositionOfAny(str,{"0".."9"},Occurrence.All),

轉換為表 = Table.FromList(源, Splitter.SplitByNothing(), null, null, ExtraValues.Error),

已添加索引 = Table.AddIndexColumn(轉換為表, "索引", 0, 1),

已添加自定義 = Table.AddColumn(已添加索引, "自定義", each

try

if 已添加索引[Column1]{[索引]}+1=已添加索引[Column1]{[索引]+1}

then "drop"

else "keep"

otherwise "end"),

篩選的行 = Table.SelectRows(已添加自定義, each ([自定義] <> "drop")),

自定義1 = Table.RowCount(篩選的行)

in

自定義1

在字符串上調用這個自定義函數就能統計出正確的數字結果。比如字符串【李四5676中華234大家庭】中的數字是2。

所以,只有統計單個數字出現的次數,才能用List.Count()結合Text.PositionOfAny()函數的方法。

如果要統計多個單數字構成的數值的出現次數,則必須用自定義函數曲線實現。

03統計字符串中漢字出現的個數

統計字符串【李四5676中華大家庭】中【漢字】出現的次數:

= List.Count(Text.PositionOfAny("李四5676中華大家庭",{"一".."龥"},Occurrence.All))


分享到:


相關文章: