zoukankan      html  css  js  c++  java
  • 基本函数(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

  • 相关阅读:
    知识点:synchronized 原理分析
    知识点:spring 完全手册
    知识点:图说 Mysql 权限管理
    知识点:Mysql 基本用法之流程控制
    知识点:Mysql 基本用法之函数
    知识点:Mysql 基本用法之存储过程
    知识点:Mysql 基本用法之事务
    知识点:Mysql 基本用法之触发器
    知识点:Mysql 基本用法之视图
    知识点:MySQL表名不区分大小写的设置方法
  • 原文地址:https://www.cnblogs.com/zeon/p/15032090.html
Copyright © 2011-2022 走看看