基本函数(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. CleanText. LowerText. UpperText. TrimText.TrimEndText.TrimStartText.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

原文地址:https://www.cnblogs.com/zeon/p/15032090.html