首页 > 技术文章 > 基本函数(2)——Power Query M语言

zeon 2021-05-13 20:47 原文

 

基本函数2

Text.ToList和Text.Split

  • Text.ToList从给定的文本值Text返回字符值列表

Text.ToList(Text) as list

示例:= Text.ToList("Hello World")

输出:{"H","e","l","l","o"," ","W","o","r","l","d"}

 实例:拆分数字

= List.Transform(更改的类型[QQ号], each Text.Combine(Text.ToList(_), "-"))

 

Text.Split返回根据指定的分隔符Separator拆分文本Text而得到的文本值列表

示例:= Text.Split("Name|Address|PhoneNumber", "|")

输出:{"Name","Address","PhoneNumber"}

 实例:统计人数

= List.Transform(源[名单], each List.Count(Text.Split (_,"、")))

 

实例3:分离数字

= List.Transform(源[代码], each Text.Combine(List.Select(Text.ToList(_), each _<="9"), "\"))

 

Text. Length、Text. Start、Text. End、Text. Middle、Text. Range

Text. Length

  • 返回字符串的长度


Text. Start与Text. End

  • Text. Start(字符串,个数) 返回字符串的前几个字符(从左提取)
  • Text. End(字符串,个数) 返回字符串的后几个字符(从右提取)


Text. Range与Text. Middle

  • Text. Range(字符串,起始位置,长度)
  • Text. Middle(字符串,起始位置,长度)

 

示例1:

= Text.Range("abdcdef", 8)

报错:超出范围

= Text.Middle("abdcdef", 8)

不报错:空

 

示例2:提取复姓

= Table.AddColumn(更改的类型, "自定义", each Text.Start([姓名], Number.From(List.PositionOf(复姓[复姓表], Text.Start([姓名], 2))<>-1)+1))

 

示例:成绩分级{90,80,60,0}

 

 

 = Table.AddColumn(源, "自定义", (n)=>Text.Range("差中良优",List.Sum(List.Transform({90,80,60,0},  each Number.From(n[成绩]>=_)))-1,1))

 

示例:分隔

= Table.AddColumn(源, "自定义", (n)=>Text.Combine(List.Transform({0..Number.From(Text.Start(Text.From(Text.Length(n[账号])/4), 1))}, each Text.Middle(n[账号],_*4,4)), "-"))

 

Text与Number

字符与字符编码的转换

  • Character.FromNumber 数字转字符
  • Character.ToNumber 字符转数字
  • 字符表达方式:#(4位或8位16进制编码)
  • 10进制转16进制:Number.ToText(10进制数,”X”)
  • 控制字符:tab(制表符-9) lf(换行符-10) cr(回车符-13)
  • #(tab)
  • #(tab,cr) #(000A,000D)

数字与文本值的转换

  • Text.From 将值转为文本类型(数字,日期,时间)
  • Number.From 将文本转为数字(数字,日期,时间,逻辑值)

Value.FromText

  • 将文本格式的:数字,日期,时间,逻辑值等转为真正的格式

 

示例:

示例:

 

 

 

 

实例:

let
    源 = Excel.CurrentWorkbook(){[Name="表43"]}[Content],
    a = 源[分数],
    b = List.Transform(a, each Text.Split(_, ",")),
    c = List.Transform(b, each List.Zip(List.Transform(_, each Text.Split(_, "-")))),
    自定义1 = List.Transform(c, each Text.Combine(_{0}, "\")&"#(lf)平均分:"&Number.ToText(List.Average(List.Transform(_{1}, each Value.FromText (_))),"f2"))
in
    自定义1

 

 

Text. Remove与Text.RemoveRange

Text. Remove

Text.Remove(文本,移除字符 as Any)

Text.RemoveRange

Text.RemoveRange(文本,移除起点位置,移除字符长度)

 

示例:

 

 

实例:

1 let
2     源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
3     a = Table.AddColumn(源, "自定义", each Table.FromColumns(List.Transform({{"0".."9"}, {"一".."龥"}}, (n)=> List.Transform(Text.Split(Text.Remove([名单], n), "、"), each Value.FromText(_))),{"姓名","分数"})),
4     #"展开的“自定义”" = Table.ExpandTableColumn(a, "自定义", {"姓名", "分数"}, {"姓名", "分数"}),
5     删除的列 = Table.RemoveColumns(#"展开的“自定义”",{"名单"})
6 in
7     删除的列

 

Text.PositionOf与Text.PositionOfAny

Text.PositionOf

Text.PositionOf(字符串,定位文本,0/1/2)

  • 定位文本可以一单个字符,也可以是多个字符。
  • 0:返回第1个
  • 1:返回最后1个
  • 2:返回全部

 

Text.PositionOfAny

Text.PositionOf(字符串,文本 as list,0/1/2)

  • 定位文本必须是单个字符,也必须是列表,
  • 0:返回第1个
  • 1:返回最后1个
  • 2:返回全部

 

 

 

实例:

提取最后一串字符
统计每个级别的次数

 

1 let
2     源 = Excel.CurrentWorkbook(){[Name="表53"]}[Content],
3     列表 = 源[编号],
4     a = List.Transform(列表, each Text.Middle(_, Text.PositionOf(_, "-", 1)+1, 99 ))
5 in
6     a

1 let
2     源 = Excel.CurrentWorkbook(){[Name="表52"]}[Content],
3     a = Table.AddColumn(源, "自定义", each Text.Combine(List.Transform({"优","良", "中", "差"}, (n)=> Number.ToText(List.Count(Text.PositionOf([级别], n, 2)), n&":" &"(0个)")), "#(lf)"))
4 in
5     a

Or

1 let
2     源 = Excel.CurrentWorkbook(){[Name="表52"]}[Content],
3     a = Table.AddColumn(源, "自定义", each Text.Combine(List.Transform({"优", "良", "中", "差"}, (x)=> Number.ToText(List.Count(List.Select(Text.ToList([级别]), each _=x)), x&":"&"(0个)")), "#(tab)"))
4 in
5     a

 

Text. Replace\ Text.ReplaceRange\ Text.Insert

Text. Replace

Text. Replace(字符串,要查找字符,替换成新字符)

Text.ReplaceRange

Text.ReplaceRange(字符串,起始位置,字符个数,替换的新值)

Text.Insert

Text.Insert(字符串,插入位置,新值)

 

 

 

 

实例:

let
    源 = Excel.CurrentWorkbook(){[Name="表66"]}[Content],
    //a = Table.AddColumn(更改的类型, "自定义", each List.Transform(Text.Split([入围成员], "、"), (n)=> Text.Replace([成员], n, "")))  //这样是逐个遍历,达不到累计效果
    a = Table.AddColumn(源, "自定义", each Text.Combine(List.Select(Text.Split(List.Accumulate(Text.Split([入围成员], ""), [成员],(x,y)=> Text.Replace(x, y, "")), ""), each _<>""), "\")),
    删除的列 = Table.RemoveColumns(a,{"组别", "成员", "入围成员"})  
in
    删除的列

1 let
2     源 = Excel.CurrentWorkbook(){[Name="表67"]}[Content],
3     已添加自定义 = Table.AddColumn(源, "自定义", each List.Accumulate({1..Text.Length([编号])/3-1},  " "&[编号], (x,y)=>Text.Insert(x, y*4,"-"))),
4     去除的文本 = Table.TransformColumns(已添加自定义,{{"自定义", Text.Trim, type text}})
5 in
6     去除的文本

let
    源 = Excel.CurrentWorkbook(){[Name="表68"]}[Content],
    更改的类型 = Table.TransformColumnTypes(源,{{"品名", type text}}),
    已添加自定义 = Table.AddColumn(更改的类型, "自定义", each Text.Insert([品名], List.Count(List.Select(Text.ToList([品名]), each _>"z")), "#(lf)"))
in
    已添加自定义

 

1

推荐阅读