求助格式化列表

Power Query 绿夏 ⋅ 于 2018-12-10 17:14:15 ⋅ 最后回复由 飞天篮球 2018-12-18 21:19:36 ⋅ 2986 阅读

格式化转换如下

已知:表1
userIDTable
ADVC
ERFT
ERTT

求格式化为表2
userIDList
{ "user_list": [{"userid":"ADVC","lang":"zh_CN"},{"userid":"ERFT","lang":"zh_CN"},{"userid":"ERTT","lang":"zh_CN"}]}

file

成为第一个点赞的人吧 :bowtie:
最佳答案
  • 飞天篮球 Talk is cheap, show me your code.
    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
          表
回复数量: 10
  • Alex MOD 社区清洁工
    2018-12-10 17:30:20
    = #table({"userIDList"},{{Text.Format("{""user_list"": [{""userid"":""#{0}"",""lang"":""zh_CN""},{""userid"":""#{1}"",""lang"":""zh_CN""},{""userid"":""#{2}"",""lang"":""zh_CN""}]}",源[userIDTable])}})

    file

  • 绿夏
    2018-12-10 17:38:44

    @Alex 谢谢大侠,格式的确符合要求。
    我忘记说了表1的行数是动态扩充的

  • 绿夏
    2018-12-10 18:20:01

    @Alex 如果表1的行是动态增加的,可以转换吗?我分步骤尝试了好几次,但结果还是不对。
    let
    源 = Excel.CurrentWorkbook(){[Name="原始表格"]}[Content],
    更改的类型 = Table.TransformColumnTypes(源,{{"userIDTable", type text}}),
    已添加自定义 = Table.AddColumn(更改的类型, "add", each Text.Combine({Text.Combine({"{""userid"":""",[userIDTable]}),"""lang"":""zh_CN""}"},",")),
    删除的列 = Table.RemoveColumns(已添加自定义,{"userIDTable"}),
    list=Table.ToList(删除的列),
    txt=Lines.ToText(list,","),
    addtxt=Text.Combine({"{ ""user_list"": [",txt,"]}"}),
    转换为表 = #table(1, {{addtxt}}),
    替换的值 = Table.ReplaceValue(转换为表,"""""","""",Replacer.ReplaceText,{"Column1"})
    in
    替换的值

    file

  • 飞天篮球 Talk is cheap, show me your code.
    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

  • 飞天篮球 Talk is cheap, show me your code.
    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

  • 飞天篮球 Talk is cheap, show me your code.
    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
          表
  • 绿夏
    2018-12-14 16:50:49

    @飞天篮球 谢谢大侠,完美解决了这个问题。原本打算把这一步得到的结果,作为网抓的content的值。貌似行不通。
    顺便问一句,那优雅的换行,是有什么自动格式化代码的工具吗?

  • 飞天篮球 Talk is cheap, show me your code.
    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

  • 绿夏
    2018-12-18 09:32:43

    @飞天篮球 好厉害。我现在看pq代码很吃力,有没有基础课程?
    从这些符号的用途开始的讲解的:{} "" [] _
    line\list\table\record\相互转化我都有些混沌了

  • 飞天篮球 Talk is cheap, show me your code.
    2018-12-18 21:19:36

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

暂无评论~~
  • 请务必阅读并严格遵守《社区管理规范与使用说明》
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 发送表情,可用的 Emoji 见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板粘贴上传, 格式限制 - jpg, png, gif
  • 不支持上传附件,请尽可能用文字和图片将问题描述清楚,如实在需要上传附件,可上传到 共享网盘 后分享链接
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
Ctrl+Enter