很多時候我們需要統計單個字符或某種字符出現的次數,那麼在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))
閱讀更多 office高效辦公 的文章
關鍵字: 統計 索引 PowerQuery