基本函數(3)——Power Query M語言


基本函數(3)

  • Text.StartsWith
  • Text.EndsWith
  • Text. Contains

Text.StartWith/Text.EndWith/Text.Contains

實例: 查詢系統

 

 M code:

let
    源 = Excel.Workbook(File.Contents("E:\data.xlsx"), null, true)[Data],
    表 = Table.Combine(List.Transform(源, each Table.PromoteHeaders(_, [PromoteAllScalars=true]))),
    a = Table.ToRecords(表),
    b = List.Select(a, each {Text.StartsWith,Text.EndsWith,Text.Contains}{List.PositionOf({"始於","止於","包含"},條件{0}[值])}({[公司名],[地址]}{List.PositionOf({"公司名","地址"},條件{1}[值])}, 條件{2}[值])),
    c = Table.FromRecords(b)
in
    c

正常查詢:

b = List.Select(a, each Text.Contains([公司名],"關鍵字"))

參數化:

  • 字段參數化
= {查詢系統[公司名],查詢系統[地址]}{List.PositionOf({"公司名","地址"},條件{1}[值])}

由於上下文的存在,表名可省略.即:

= {[公司名],[地址]}{List.PositionOf({"公司名","地址"},條件{1}[值])}
  • 同理,函數參數化
= {Text.StartsWith,Text.EndsWith,Text.Contains}{List.PositionOf({"始於","止於","包含"},條件{0}[值])}

 

Text.Repeat/Text.SplitAny

  • Text.Repeat(字符,重復次數)
  • Text.SplitAny(文本,拆分字符串)

Text.SplitAny拆分字符串:可以是多個字符串

  1. 實例1:統計各部門人數
  2. 實例2:規范編號
  3. 實例3:進度圖制作

實例1:統計各部門人數

 

 

let
    源 = Excel.CurrentWorkbook(){[Name="表2"]}[Content],
    已添加自定義 = Table.AddColumn(源, "計數", each List.Count(Text.SplitAny([業績],"\、")))
in
    已添加自定義

實例2:規范編號

 

 

 

let
    源 = Excel.CurrentWorkbook(){[Name="表2_5"]}[Content],
    更改的類型 = Table.TransformColumnTypes(源,{{"編號", type text}}),
    已添加自定義 = Table.AddColumn(更改的類型, "自定義", each Text.Combine(List.Transform(Text.SplitAny([編號],Text.Remove(Text.Combine(源[編號]),{"0".."9"})),each Text.Repeat("0",4-Text.Length(_))&_),"\"))
in
    已添加自定義

取出分隔符:

= Text.Remove(Text.Combine(實例2[編號]),{"0".."9"})

 

 去重分隔符:

= List.Distinct(Text.ToList(Text.Remove(Text.Combine(實例2[編號]),{"0".."9"})))

合並分隔符:

=Text.Combine(List.Distinct(Text.ToList(Text.Remove(Text.Combine(實例2[編號]),{"0".."9"}))))

 

 

實例3:進度圖制作

 

 

 

let
    源 = Excel.CurrentWorkbook(){[Name="表4"]}[Content],
    已添加自定義 = Table.AddColumn(源, "進度圖", each Text.Combine(List.Transform(Text.SplitAny([業績],Text.Combine(List.Distinct(Text.ToList(Text.Remove(Text.Combine(源[業績]),{"0".."9","一".."龥"}))))),each _&Text.Repeat("|",Number.From(Text.Remove(_,{"一".."龥"}))/1000)),"#(lf)"))
in
    已添加自定義

取分隔符:

=Text.Combine(List.Distinct(Text.ToList(Text.Remove(Text.Combine(實例3[業績]),{"0".."9","一".."龥"}))))

 

Text.PadStart/Text.PadEnd

  • Text.PadStart(文本,位寬,字符)
  • Text.PadEnd(文本,位寬,字符)

實例1

 

 

 

let
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    已添加自定義 = Table.AddColumn(源, "修正編號", each Text.Combine(List.Transform(Text.Split([編號],"-"),each "NED"&Text.PadStart(_,4,"0")),"-"))
in
    已添加自定義

實例2

 

 

 

let
    源 = Excel.CurrentWorkbook(){[Name="表3"]}[Content],
    已添加自定義 = Table.AddColumn(源, "圖形", each Text.Combine(List.Transform(Text.Split([1季度],"-"),each Text.PadEnd(Text.Repeat("★",Number.From(_)),10,"☆") ),"#(lf)")),
    刪除的其他列 = Table.SelectColumns(已添加自定義,{"圖形"})
in
    刪除的其他列

 

 

 Text. Clean\Text. Lower\Text. Upper\Text. Trim\Text.TrimEnd\Text.TrimStart\Text.Proper

  • Text.Clean(文本) 清除非打印字符,如回車符,換行符等
  • Text.Trim()同時清除前導和后綴空格,也可以清除指定字符
  • Text.TrimStart清除前導空格,也可以清除指定字符
  • Text.TrimEnd清除后綴空格,也可以清除指定字符
  • Text.Lower 字母小寫
  • Text.Upper 字母大寫
  • Text.Proper 首詞首字母大寫,其余小寫

實例1

 

 

let
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    更改的類型 = Table.TransformColumnTypes(源,{{"語句", type text}}),
    a = Table.AddColumn(更改的類型, "提取", each Text.Trim([語句],{"一".."龥","0".."9"})),
    已添加自定義 = Table.AddColumn(a, "序號", each Number.From(Text.SplitAny([提取],"[]"){1})),
    排序的行 = Table.Sort(已添加自定義,{{"序號", Order.Ascending}}),
    刪除的列 = Table.RemoveColumns(排序的行,{"語句"})
in
    刪除的列

 

 

Combiner合並器

  • Combiner.CombineTextByDelimiter(符號)(list)    使用指定符號將列表合並為單個文本
  • Combiner.CombineTextByEachDelimiter(list)(list)    將符號列表對應列表合並為一個文本
  • Combiner.CombineTextByLengths(list)(list)    使用指定長度將列表合並為單個文本
  • Combiner.CombineTextByPositions(list)(list)    指用指定位置合並列表為一個文本
  • Combiner.CombineTextByRanges(list as list)(list)    根據指定的位置和長度將列表合並為一個文本

 

Combiner.CombineTextByDelimiter

 Combiner.CombineTextByEachDelimiter

 Combiner.CombineTextByLengths

 注:分別提取3,1,2個字符,其余的按預配字符填充

Combiner.CombineTextByPositions

 注:位置序列必須按序填寫,即0<1<4<5;說明:0位在串1取,1~3位在串2取,4位在串3取,其余按預配字符填充

Combiner.CombineTextByRanges

 注:在串1從1位開始取2個,在串2從3位開始取5個(本可3位全取但{5,2}限制了從5位取),在串3從5位開始取2個,其余按預配字符填充

 

實例:

  • 給名單加編號
  • 將名單對齊
  • 提取等級

let
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    已添加自定義 = Table.AddColumn(源, "自定義", each Text.Middle(Combiner.CombineTextByEachDelimiter(List.Transform({"1".."9"},each "、"&_&"."))({""}&Text.Split([名單],"、")),1,99))
in
    已添加自定義

let
    源 = Excel.CurrentWorkbook(){[Name="表2"]}[Content],
    更改的類型 = Table.TransformColumnTypes(源,{{"組別", type text}, {"名單", type text}}),
    已添加自定義 = Table.AddColumn(更改的類型, "自定義", each Text.Combine(List.Transform(Text.Split([名單],"、"),each Combiner.CombineTextByLengths({Text.Length(_)},"    ")({_}))))
in
    已添加自定義

let
    源 = Excel.CurrentWorkbook(){[Name="表3"]}[Content],
    已添加自定義 = Table.AddColumn(源, "自定義", each Combiner.CombineTextByPositions({1..12})(List.Range(Record.ToList(_),1,99)))
in
    已添加自定義

 

Spliter拆分器

  • Splitter.SplitByNothing    不拆分
  • Splitter.SplitTextByDelimiter    根據指定分隔符將文本拆分成單個列表
  • Splitter.SplitTextByEachDelimiter    指定每一個列表中的分隔符對文本進行拆分
  • Splitter.SplitTextByLengths按每個指定的長度拆分文本為列表
  • Splitter.SplitTextPositions指定每個位置將文本拆分成列表
  • Splitter.SplitTextByRanges根據指定每個偏移量和長度將文本拆分成列表
  • Splitter.SplitTextByWhitespace以空白字符為准將文本拆分成列表

實例

  • 以序號拆分記錄
  • 將身份證號用符號分隔

let
    源 = Excel.CurrentWorkbook(){[Name="表2"]}[Content],
    更改的類型 = Table.TransformColumnTypes(源,{{"數據", type text}}),
    已添加自定義 = Table.AddColumn(更改的類型, "a", each Table.FromRows({List.Range(Splitter.SplitTextByEachDelimiter(List.Transform({1..9},each Number.ToText(_,"0\.")))([數據]),1,99)} ))[a],
    自定義1 = Table.Combine(已添加自定義)
in
    自定義1

let
    源 = Excel.CurrentWorkbook(){[Name="表4"]}[Content],
    已添加自定義 = Table.AddColumn(源, "分段后", each Text.Combine(Splitter.SplitTextByLengths(if Text.Length([身份證號])=18 then {6,8,4} else {6,6,3})([身份證號])," ")),
    刪除的列 = Table.RemoveColumns(已添加自定義,{"姓名", "身份證號"})
in
    刪除的列

 

1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM