飞天篮球

边齐
第 3 位会员
注册于 2018-08-08 14:57:03
活跃于 2020-04-01 16:24:24


  • 城市
  • power query 可以开车了你知道吗? at 2019-01-09 15:09:21

    @夜幕 请按楼上老板的意思处理:laughing: :laughing: :laughing: :laughing: :laughing:

  • 如何用最简洁的语句完成以下拆分 at 2019-01-07 22:23:21

    一样的,换汤不换药,短不了,供参考。

    = #table( {"明细科目","类别","项目","备注","币种"},
              Table.ToList( 源, each List.Skip(List.RemoveItems(Text.SplitAny(_{0},"()-|币别:"),{""}))))

    或者

    = Table.SplitColumn( 源, 
                        "明细科目", 
                         each List.Skip(List.RemoveItems(Text.SplitAny(_,"()-|币别:"),{""})),
                         {"明细科目","类别","项目","备注","币种"} )
  • 超级有难度的查询,求大神帮忙 at 2018-12-24 15:21:18

    @ksbor

    那你试试吧,看运行结果是不是你想要的。由于使用了Table.SelectRows,所以效率欠佳,加载到表有点慢。

    先把工作表中前五列所在的数据区域Ctrl+T变成表,表名为“表1”,导入PQ,进入高级编辑器,先清空,再把以下语句贴入:

    let
        源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    
        变 = Table.SplitColumn(
                               Table.AddColumn( 源,"a",each let p = Table.PositionOf(源,_),
                                                                l = {Table.Buffer(Table.Range(源,0,p)),Table.Buffer(Table.Range(源,p+1))}
                                                             in List.Combine(
                                                                             Table.TransformRows(
                                                                                                 Table.Range(
                                                                                                             Table.SelectRows( l{1},
                                                                                                                               (x)=>List.Contains({x[名称1],x[名称2]},[名称1]))
                                                                                                             ,0,3),
                                                                                                 each Record.ToList(
                                                                                                                    Table.Last( 
                                                                                                                               Table.SelectRows( l{0},
                                                                                                                               (x)=> List.ContainsAll({x[名称1],x[名称2]},{[名称1],[名称2]}))
                                                                                                                               ,[] ) )))  )
                             ,"a",each _,15)
    in
        变
  • 超级有难度的查询,求大神帮忙 at 2018-12-24 14:14:55

    是这个意思吗?

    2017第37组,未来三组是38和2018的1,2,然后查找2017第37组之前的数据

    2018第1组,未来三组是2,3,4,然后查找2018第1组之前的数据,就是2017年的数据

    2018第2组,未来三组是3,4,5,然后查找2018第2组之前的数据,就是2018第1组+2017年的数据

    2018第3组,未来三组是4,5,6,然后查找2018第3组之前的数据,就是2018第1、2组+2017年的数据

    ......

  • 如何在 PQ 中将左边箭头所指的这三个值去掉 (或者说,有没有办法将向下填充进行反操作) at 2018-12-21 21:50:11

    @老河

    哈哈,知道了,没整到位。谢谢指正!!试试这个吧,请斧正。

    先把整个表Table.ToRecords,然后根据客户和收入为判断条件进行迭代。

    变 = List.Accumulate( Table.ToRecords(源),
                              { {},"","" },
                              (s,c)=> if   s{1}=c[客户] and s{2}=c[收入] 
                                      then { s{0}&{c&[客户=c[客户],收入=null]},c[客户],c[收入] } 
                                      else { s{0}&{c&[客户=c[客户],收入=c[收入]]},c[客户],c[收入] } ) {0},
    果 = Table.FromRecords(变)
    
  • 如何在 PQ 中将左边箭头所指的这三个值去掉 (或者说,有没有办法将向下填充进行反操作) at 2018-12-18 22:21:24

    @老河 把迭代出错的晒出来瞅瞅!!

  • 求助格式化列表 at 2018-12-18 21:19:36

    @绿夏
    PQ网课可以去"M与DAX的恩怨纠葛"群里问问。

  • 如何在 PQ 中将左边箭头所指的这三个值去掉 (或者说,有没有办法将向下填充进行反操作) at 2018-12-17 16:01:48

    fyi...

    1、向下填充的逆过程可以参考pqfans文章:https://pqfans.com/1682.html

    2、也可以试试这个。在得到表的那一步的基础上,添加一步,并把以下公式中的“表”字变成那一步的“步骤名"

          = Table.FromColumns(
                               List.ReplaceRange( Table.ToColumns(表),2,1,       //此处可以把收入对应的索引值2做成动态的List.PositionOf(Table.ColumnNames(表),"收入")
                                                  { List.Accumulate( 表[收入],    //深化出收入这一列,用acc实现filldown的反操作
                                                                     {{},""},
                                                                     (s,c)=>if   c=s{1} 
                                                                            then {s{0}&{null},c} 
                                                                            else {s{0}&{c},c} ) {0} } )
                               ,Table.ColumnNames(表) )
    
  • 求助格式化列表 at 2018-12-17 13:43:56

    @绿夏
    换行是手动对齐的,没有用格式化工具。

    黑色的那一大块是网站的Markdown语法。代码前后输入一组```。

    Dig Deeper

    这种JSON格式转换,还有一种场景是对汉字的处理。

    Text.FromBinary(Json.FromValue())解析出来的汉字是Unicode编码,

    可以用JS中unescape进行转码处理成以汉字形式显示。

    blw fyi:

    let
        源   = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    
        Json = Text.FromBinary(Json.FromValue(源)),           //用Json.FromValue把源表转换成二进制,再用Text.FromBinary解析,得到Unicode字符
    
        转义 = Text.Replace(Json,"\","%"),                    //把Unicode字符\uxxxx转换成%uxxxx形式的字符序列(x表示十六进制的数字),用于unescape解析
    
        解析 = Web.Page("<script> var strObj = '"&转义&"';     
                                      result = unescape(strObj);    
                                  document.write(result);
                        </script>") [Data]{0}[Children]{0}[Children]{1}[Text]{0}
    in
        解析

    e.g.

    file

  • 合并文件夹的衍生问题 at 2018-12-15 23:16:00

    fyi...试试...先把Content列中的Binary用Excel.Workbook解析出来,观察后发现每个工作簿中包含的工作表都出现了,然后用Table.SelectRows选择Name="成本"的行,深化出Data列,再Table.Combine.

    let
        源 = Folder.Files("C:\Users\HP\Desktop\文件夹"),
        合 = Table.Combine(
                           Table.TransformColumns( 源, { "Content", 
                                                         (x)=>Table.SelectRows( Excel.Workbook(x,true,false),
                                                                                each [Name]="成本" )
                                                              [Data]{0} }
                                                  ) [Content] 
                          )
    in
        合
  • 用 PQ 合并生意参谋的数据表格,会发生数据错误 “外部表不是预期的格式” 如何解决 at 2018-12-13 12:45:55

    有个解法供参考。M+JS,老早之前在畅心的指导下完成的。

    1、需要设置Internet选项中的自定义级别,"对未标记为可安全执行脚本的ActiveX控件"选项,选择启用。 https://pqfans.com/2645.html 这里也有相关的介绍。

    2、把path改为自己PC中的文件夹路径。

    3、有个不好的地方,这个方法 可能 会增加Excel进程,如果进程太多会导致死机,所以要关注任务管理器中的excel进程,如果运行之后有多余的excel进程,需关掉。 有新的文件需要parse时,如果结果不更新,刷新一下即可。

    Give it a shot....lol...

    let
            path = "\\\\Mac\\Home\\Downloads\\生意参谋平台\\",         // 文件夹路径,这是MAC中的格式,可修改为WIN中的格式;
    
              源 = Folder.Files(path),
    
        fileName = Text.FromBinary(Json.FromValue(源[Name])),        // 获取所有文件名并转化成JS中的数组格式,供下一步遍历;
    
       open_save = Web.Page("<script> var oXL = new ActiveXObject('Excel.application');
                                      var arr = "&fileName&";
                                      for (var i=0;i<arr.length;i++){ oWB = oXL.Workbooks.open('"&path&"'+arr[i]);
                                                                      oWB.Save() };
                                          oXL.Quit();
                           </script>"),
    
           parse = Table.TransformColumns(源,{"Content",each Excel.Workbook(_)[Data]{0}})
    
    in
           parse
  • 求助格式化列表 at 2018-12-11 21:41:11

    Json.FromValue的处理对象可以是上述的records as list,也可以是一个table。

    本例也可以这样解:

    let
         源  = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    
        tbl  = Table.AddColumn(源,"lang",each "zh_CN"),
    
        Json = Text.FromBinary(Json.FromValue(tbl)),
    
          表 = #table( {"userIDList"},{{ "{ ""user_list"": " & Json & "}" }} )
    
    in
          表
  • 关于正则 at 2018-12-11 17:13:48

    正则这一块网上有很多资料,你可以对照着去搜一下,中英文的都有。有具体案例可以po出来。

    ?: 表示非捕获分组,或者 non-capturing groups;

    ?= 表示顺序肯定环视,或者正预测零宽断言,也有的叫预搜索,有很多玄乎的叫法,英文叫 Positive Lookahead;

    ?! 表示顺序否定环视,英文叫 Negative Lookahead

    环视(Lookaround or zero-length assertions) 这一块还有 ?<= 逆序肯定环视 Positive Lookbehind 和 ?<! 逆序否定环视 Negative Lookbehind .
    JS中的正则是不支持逆序环视的,Python中的正则regex模块两者都支持。

  • 求助格式化列表 at 2018-12-10 22:52:47

    或者用 Json.FromValue把主要部分先做出来,其它的细节相应处理一下就可以了

    let
          源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    
        Json = Text.FromBinary(
                               Json.FromValue(
                                              Table.TransformRows( 源, each _ & [lang="zh_CN"] )
                                              )
                               )
    in
        Json

    file

  • 求助格式化列表 at 2018-12-10 22:22:12

    fyi...

    let
        源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    
        变 = "{ ""user_list"": ["
              &
              Text.Combine(
                           List.Transform(
                                          源[userIDTable],
                                          each "{""userid"":"""
                                                &_&
                                                """,""lang"":""zh_CN""}"
                                         )
                          , ",")
              &
              "]}",
    
       表 = #table({"userIDList"},{{变}})
    
    in
       表

    file