基本函数(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:统计各部门人数
- 实例2:规范编号
- 实例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