PowerQuery 语法:根据文本与列标题的匹配动态填充行

问题描述 投票:0回答:1

我正在尝试用真/假值填充列。 如果字段具有与列标题匹配的值,则为 true,否则为 false 或 null。

我需要循环遍历字段中的值:例如POWERAPPS_VIRAL、POWERAPPS_INDIVIDUAL_USER、SPE_F5_SECCOMP、SPE_F1、POWER_BI_STANDARD 并“勾选”标题与说明中给定值相同的每一列。注意:这些值没有排序,因此我必须解析该字段而不仅仅是扩展它。

到目前为止,我只能返回笛卡尔积,无法唯一解析描述字段。

这是我得到的输出示例,除了许可证详细信息之外的所有行值都以空值开始。 (注:大约有 50 个可能的值,我没有将它们全部包含在内):

许可证详情 DYN365_BUSCENTRAL_ESSENTIAL_ISVEMB DYN365_ENTERPRISE_CUSTOMER_SERVICE DYN365_ENTERPRISE_FIELD_SERVICE DYN365_财经 DYN365_HUMAN_RESOURCES_ATTACH DYN365_PROJECT_OPERATIONS_ATTACH DYN365_单片机 DYN365_SCM_ATTACH Dynamics_365_Field_Service_Enterprise_viral_Trial
D365_FIELD_SERVICE_ATTACH、DYN365_FINANCE、DYN365_SCM_ATTACH [列表] [列表] [列表] [列表] [列表] [列表] [列表] [列表] [列表]
D365_CUSTOMER_SERVICE_ENT_ATTACH、D365_FIELD_SERVICE_ATTACH、DYN365_SCM_ATTACH, [列表] [列表] [列表] [列表] [列表] [列表] [列表] [列表] [列表]
D365_CUSTOMER_SERVICE_ENT_ATTACH、D365_FIELD_SERVICE_ATTACH、DYN365_FINANCE、DYN365_SCM_ATTACH [列表] [列表] [列表] [列表] [列表] [列表] [列表] [列表] [列表]
D365_CUSTOMER_SERVICE_ENT_ATTACH、D365_FIELD_SERVICE_ATTACH、DYN365_FINANCE [列表] [列表] [列表] [列表] [列表] [列表] [列表] [列表] [列表]
D365_CUSTOMER_SERVICE_ENT_ATTACH、D365_FIELD_SERVICE_ATTACH、DYN365_FINANCE [列表] [列表] [列表] [列表] [列表] [列表] [列表] [列表] [列表]

我成功完成一半工作的唯一代码如下(它产生上面的结果,其中列表填充了所有列值):

let
    Source = ExpandedUserTable,
    _Lookups = List.Buffer(Table.ColumnNames(LicenceLookUpFinal)),
// LicenceLookUpFinal is the result of scanning a file to produce a row for every unique Licence type in Licence Description
 
   #"Replaced Value" = Table.ReplaceValue(
        Source,
        null,
        _Lookups,
        Replacer.ReplaceValue, _Lookups 
    )
in
    #"Replaced Value"

(请原谅特殊的缩进,但其他任何事情都会让我的注意力缺陷多动症发作)这显示了上面的结果。

我想要达到的是这个(示例中并未出现所有可能的列):

许可证详情 DYN365_BUSCENTRAL_ESSENTIAL_ISVEMB DYN365_ENTERPRISE_CUSTOMER_SERVICE DYN365_ENTERPRISE_FIELD_SERVICE DYN365_财经 DYN365_HUMAN_RESOURCES_ATTACH DYN365_PROJECT_OPERATIONS_ATTACH DYN365_单片机 DYN365_SCM_ATTACH Dynamics_365_Field_Service_Enterprise_viral_Trial
D365_FIELD_SERVICE_ATTACH、DYN365_FINANCE、DYN365_SCM_ATTACH
D365_CUSTOMER_SERVICE_ENT_ATTACH、D365_FIELD_SERVICE_ATTACH、DYN365_SCM_ATTACH,
D365_CUSTOMER_SERVICE_ENT_ATTACH、D365_FIELD_SERVICE_ATTACH、DYN365_FINANCE、DYN365_SCM_ATTACH
D365_CUSTOMER_SERVICE_ENT_ATTACH、D365_FIELD_SERVICE_ATTACH、DYN365_FINANCE
D365_CUSTOMER_SERVICE_ENT_ATTACH、D365_FIELD_SERVICE_ATTACH、DYN365_FINANCE

我尝试在语句中引入“each”,但是在删除任何语法错误后,我得到了一组令人困惑的运行时错误代码。例如:“我们无法应用 List 类型的索引”,或者我向函数提供了太多参数。

经过几个小时的尝试解决后,我想知道: a) 这可能吗? b) 我是否从正确的方向处理这个问题(我是 Powerquery 的自学早中级 - 所以这绝对是一个选择)

powerquery powerbi-desktop
1个回答
0
投票

我假设您的原始数据仅从您发布的内容的第一列开始:
enter image description here

如果是这种情况,这段代码应该会产生您想要的输出:

let
    Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"License Details", type text}}),
    
//create unique list of Licenses
    #"License List" = 
        List.Distinct(
            List.Transform(
            List.RemoveItems(
                List.Combine(
                    List.Transform(#"Changed Type"[License Details], 
                        each Text.Split(_,","))
                ),
            {""}), each Text.Trim(_))),

//add a column for each License type 
    #"Add Columns" = List.Accumulate(
        #"License List",
        #"Changed Type",
        (s,c)=> Table.AddColumn(s, c,each null, type nullable text)),
    
//Add ticks to appropriate column if License exists in the first column
    #"Add Ticks" = List.Accumulate(
        List.Numbers(0, List.Count(#"License List")),
        #"Add Columns",
        (s,c)=> 
            Table.ReplaceValue(
            s,
            each [License Details],
            Character.FromNumber(Expression.Evaluate("0x2714")),
            (x,y,z) as nullable text=> if List.Contains(Text.Split(Text.Remove(y," ")  ,","),#"License List"{c}) then z else x   ,
            {#"License List"{c}})
        )
in
    #"Add Ticks"

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.