如何避免在 Power Query 的示例文件中出现“表达式错误:未找到表的“xxxxxx”列”?

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

我正在使用 Power Query 中的数据加载器, 所有要处理的数据都取自文件夹中的多个 .xlsx 文件。 我遇到的问题是,尽管列始终具有相同的标题,但它们的编号永远不会相同,因此 Power Query 采用的示例文件(文件夹中第一个位置的文件)。

Expresion.Error: The column

为了解决这个问题,我突然想到我可以设置一个包含所有可能列的默认空表,然后让流程从那里开始。

我该怎么做?

样品表必须如下:

    SampleFile= #table({"Pronombre", "Información Personal (Prefijo)", "Información Personal (Nombre)", "Información Personal (Segundo nombre)","Información Personal (Apellidos)","Información Personal (Sufijo)", "Email", "DNI", "Cód. Área Telefónico", "Teléfono", "Monto Donación", "Otro monto", "Forma de Pago", "CBU", "Tarjeta", "Column16", "Column17", "Column18", "Column19", "Column20", "Column21", "Column22", "Column23", "Column24", "Column25", "Column26", "Column27", "Column28", "Mes Vto.", "Año Vto.", "DATOS DE ENVÍO", "Dirección", "Piso y Departamento", "Barrio", "Código Postal", "Ciudad", "Provincia", "¿Cómo llegaste?", "Pronombre_1", "Campaign Source", "Campaign Medium", "Campaign Name", "Campaign Term", "Campaign Content", "Creada por (ID de usuario)", "ID Entrada", "Fecha entrada", "Fecha de actualización", "URL de origen", "ID de transacción", "Cantidad del pago", "Fecha de pago", "Estado del pago", "Id de entrada", "Agente de usuario", "IP del usuario", "ID de la entrada parcial", "ProgresoProgreso: campos obligatorios", "Puntuación de reCAPTCHA"}, {})

“示例文件”代码如下:

let
    DigitalPath= Excel.CurrentWorkbook(){[Name="DigitalPath"]}[Content][Column1]{0},
    Origen = Folder.Files(DigitalPath),
    Navegación1 = Origen{0}[Content]
in
    Navegación1

“Transform sample file”的代码是:

let
    Origen = Excel.Workbook(Parámetro6, null, true),
    #"basico-en-2-pasos-marzo-2020-20_Sheet" = Origen{0}[Data],
    #"Encabezados promovidos" = Table.PromoteHeaders(#"basico-en-2-pasos-marzo-2020-20_Sheet", [PromoteAllScalars=true])
in
    #"Encabezados promovidos"

流程代码为:

let
       EmptyTable = #table({"Source.Name", "Nombre", "Apellido", "Email","N_de_Documento__c","MobilePhone", "Tipo de Tarjeta","MailingStreet", "MailingPostalCode",  "MailingCity", "Provincia","Descripci_n_Fuente__c","Medio_Campa_a__c", "Campaña","Contenido_Campa_a__c", "ID Entrada", "Fecha_Ingreso__c","Numero de Tarjeta","Monto_Donacion__c","Vencimiento__c","Fuente__c"}, {}),
    DigitalPath= Excel.CurrentWorkbook(){[Name="DigitalPath"]}[Content][Column1]{0},
    Origen = try Table.Buffer(Folder.Files(DigitalPath)) otherwise #table({"Empty table" }, {}),
    result = if Table.IsEmpty(Origen) then EmptyTable else (
let
    #"Archivos ocultos filtrados1" = Table.SelectRows(Origen, each [Attributes]?[Hidden]? <> true),
    #"Invocar función personalizada1" = Table.AddColumn(#"Archivos ocultos filtrados1", "Transformar archivo (6)", each #"Transformar archivo (6)"([Content])),
    #"Columnas con nombre cambiado1" = Table.RenameColumns(#"Invocar función personalizada1", {"Name", "Source.Name"}),
    #"Otras columnas quitadas1" = Table.SelectColumns(#"Columnas con nombre cambiado1", {"Source.Name", "Transformar archivo (6)"}),
    #"Columna de tabla expandida1" = Table.ExpandTableColumn(#"Otras columnas quitadas1", "Transformar archivo (6)", Table.ColumnNames(#"Transformar archivo (6)"(#"Archivo de ejemplo (6)"))),
    #"Numero de tarjeta1" = Table.CombineColumns(Table.TransformColumnTypes(#"Columna de tabla expandida1", {{"Column17", type text}, {"Column18", type text}, {"Column19", type text}, {"Column21", type text}, {"Column22", type text}, {"Column23", type text}, {"Column24", type text}, {"Column25", type text}, {"Column26", type text}, {"Column27", type text}}, "es-AR"),{"Column15", "Column16", "Column17", "Column18", "Column19", "Column20", "Column21", "Column22", "Column23", "Column24", "Column25", "Column26", "Column27"},Combiner.CombineTextByDelimiter("", QuoteStyle.None),"N° de Tarjeta"),
    #"Numero de Tarjeta" = Table.AddColumn(#"Numero de tarjeta1", "Numero de Tarjeta", each Text.Combine({[CBU], [#"N° de Tarjeta"]}, ""), type text),
    #"Valor reemplazado1" = Table.ReplaceValue(#"Numero de Tarjeta"," ","",Replacer.ReplaceText,{"Numero de Tarjeta"}),
    #"Valor reemplazado2" = Table.ReplaceValue(#"Valor reemplazado1","",null,Replacer.ReplaceValue,{"Numero de Tarjeta"}),
    #"Tipo cambiado" = Table.TransformColumnTypes(#"Valor reemplazado2",{{"Otro monto", type text}, {"Teléfono", type text}, {"Cód. Área Telefónico", type text}, {"Piso y Departamento", type text}, {"Dirección", type text}}),
    MailingStreet = Table.AddColumn(#"Tipo cambiado", "MailingStreet", each [Dirección]& " " &[Piso y Departamento]),
    Monto_Donacion__c = Table.AddColumn(MailingStreet, "Monto_Donacion__c", each if [Monto Donación] = "Quiero donar otro monto" then Text.Select([Otro monto], {"0".."9"}) else [Monto Donación]),
    #"Mes de Vencimiento" = Table.AddColumn(Monto_Donacion__c, "Personalizado", each if [#"Mes Vto."] = null and [#"Año Vto."] = null then null else if [#"Mes Vto."] = "Diciembre" then 12 else if [#"Mes Vto."] = "Noviembre" then 11 else if [#"Mes Vto."] = "Octubre" then 10 else if [#"Mes Vto."] = "Enero" then 1 else if [#"Mes Vto."] = "Febrero" then 2 else if [#"Mes Vto."] = "Marzo" then 3 else if [#"Mes Vto."] = "Abril" then 4 else if [#"Mes Vto."] = "Mayo" then 5 else if [#"Mes Vto."] = "Junio" then 6 else if [#"Mes Vto."] = "Julio" then 7 else if [#"Mes Vto."] = "Agosto" then 8 else if [#"Mes Vto."] = "Septiembre" then 9 else if [#"Mes Vto."] = "Setiembre" then 9 else null),
    #"Últimos caracteres insertados" = Table.AddColumn(#"Mes de Vencimiento", "Últimos caracteres", each Text.End(Text.From([#"Año Vto."], "es-AR"), 2), type text),
    #"Tipo cambiado2" = Table.TransformColumnTypes(#"Últimos caracteres insertados",{{"Últimos caracteres", Int64.Type}, {"Código Postal", type text}}),
    Vencimiento__c = Table.AddColumn(#"Tipo cambiado2", "Vencimiento__c", each if [#"Mes Vto."] <> null then "28/"&Number.ToText([Personalizado])&"/"&Number.ToText([Últimos caracteres]) else null),
    #"Valor reemplazado3" = Table.ReplaceValue(Vencimiento__c,"-","",Replacer.ReplaceText,{"Cód. Área Telefónico", "Teléfono"}),
    #"Valor reemplazado4" = Table.ReplaceValue(#"Valor reemplazado3"," ","",Replacer.ReplaceText,{"Cód. Área Telefónico", "Teléfono"}),
    #"Personalizada agregada3" = Table.AddColumn(#"Valor reemplazado4", "Remove 15", each if Text.StartsWith([Teléfono], "15") = true then Text.AfterDelimiter([Teléfono], "15") else [Teléfono]),
    #"Columnas combinadas" = Table.CombineColumns(#"Personalizada agregada3",{"Cód. Área Telefónico", "Remove 15"},Combiner.CombineTextByDelimiter("", QuoteStyle.None),"MobilePhone"),
    Fuente__c = Table.AddColumn(#"Columnas combinadas", "Fuente__c", each if [ID Entrada]<>null then [ID Entrada] else "Web"),
    #"Valor reemplazado" = Table.ReplaceValue(Fuente__c," ","",Replacer.ReplaceText,{"Numero de Tarjeta"}),
    #"Personalizada agregada" = Table.AddColumn(#"Valor reemplazado", "MailingPostalCode", each Text.Remove([Código Postal], {"A".."z"})),
    #"Columnas con nombre cambiado" = Table.RenameColumns(#"Personalizada agregada",{{"Información Personal (Nombre)", "Nombre"}, {"Información Personal (Apellidos)", "Apellido"}, {"Tarjeta", "Tipo de Tarjeta"}, {"Ciudad", "MailingCity"}, {"Provincia", "Provincia"}, {"Campaign Medium", "Medio_Campa_a__c"}, {"Campaign Name", "Campaña"}, {"Campaign Content", "Contenido_Campa_a__c"}, {"Fecha entrada", "Fecha_Ingreso__c"}, {"Campaign Source", "Descripci_n_Fuente__c"}}),
    #"Tipo cambiado1" = Table.TransformColumnTypes(#"Columnas con nombre cambiado",{{"Vencimiento__c", type date}, {"Fecha_Ingreso__c", type date}, {"MailingPostalCode", Int64.Type}}),
    #"Columnas quitadas" = Table.RemoveColumns(#"Tipo cambiado1",{"Monto Donación", "Otro monto", "Forma de Pago", "DATOS DE ENVÍO", "Barrio", "¿Cómo llegaste?", "Página / URL de Origen", "Campaign Term", "Mes Vto.", "Información Personal (Prefijo)", "Información Personal (Segundo nombre)", "Información Personal (Sufijo)", "CBU", "Año Vto.", "Creada por (ID de usuario)", "Personalizado", "Últimos caracteres", "N° de Tarjeta", "Column47", "Column48", "Column49", "Column50", "Column51", "Column52", "Column53", "Column54", "Column55", "Teléfono", "Dirección", "Piso y Departamento", "Código Postal"})
in
    #"Columnas quitadas"
)
in
    result

我一直在尝试在“示例文件”和“转换示例文件”中创建下表:

EmptyTable = #table({"Source.Name", "Nombre", "Apellido", "Email","N_de_Documento__c","MobilePhone", "Tipo de Tarjeta","MailingStreet", "MailingPostalCode",  "MailingCity", "Provincia","Descripci_n_Fuente__c","Medio_Campa_a__c", "Campaña","Contenido_Campa_a__c", "ID Entrada", "Fecha_Ingreso__c","Numero de Tarjeta","Monto_Donacion__c","Vencimiento__c","Fuente__c"}, {}),

从“来源”调用它,但它不起作用。

感谢您的帮助!

powerquery m
2个回答
0
投票

您是否尝试将所有文件合并到一个目录中,即使每个文件的列标题不同?

let Source = Folder.Files("C:\subdirectory\directory"),
#"Filtered Rows" = Table.SelectRows(Source, each ([Extension] = ".xlsx")),
#"Removed Other Columns" = Table.SelectColumns(#"Filtered Rows",{"Name", "Content"}),
#"Added Custom" = Table.AddColumn(#"Removed Other Columns", "GetFileData", each Excel.Workbook([Content],true)),
#"Expanded GetFileData" = Table.ExpandTableColumn(#"Added Custom", "GetFileData", {"Data", "Hidden", "Item", "Kind", "Name"}, {"Data", "Hidden", "Item", "Kind", "Sheet"}),
#"Removed Columns" = Table.RemoveColumns(#"Expanded GetFileData",{"Content", "Hidden", "Item", "Kind"}),
List = List.Union(List.Transform(#"Removed Columns"[Data], each Table.ColumnNames(_))),
#"Expanded Data" = Table.ExpandTableColumn(#"Removed Columns", "Data", List,List)
in  #"Expanded Data"

0
投票

您可以通过创建一个名为“fTableEnsureColumns”的新查询来创建一个函数,代码为:

let
  fAddNullColumn = (t as table, c as text) as table => Table.AddColumn(
    t,
    c,
    each null
  ),
  // curried version
  f2 = (ColumnNames as list)
   => (t as table)
   => List.Accumulate(
    // Missing columns
    List.RemoveItems(
      Table.ColumnNames(t),
      ColumnNames
    ),
    t,
    fAddNullColumn
  )
in
  // wrapper so the curyying is optional
  (ColumnNames as list, optional t as table) =>
  if t is null then
    // Only one argument. Return function expecting the second argument
    f2(ColumnNames)
  else
    // Both arguments given
    f2(ColumnNames)(t)

Currying 不是创建一个接受两个参数的函数,而是创建一个返回接受下一个参数的函数的单参数函数。这有点奇怪,但我喜欢制作可重用的函数,这是您可以在将来可能需要的任何地方复制和使用的东西,并且将其用作柯里化函数(调用

fTableEnsureColumn(columns)(table)
)的能力使它更加可重复使用。

例如,如果您有一个名为“RequiredColumns”的查询,它等同于...

{"Source.Name", "Nombre", "Apellido", "Email","N_de_Documento__c","MobilePhone", "Tipo de Tarjeta","MailingStreet", "MailingPostalCode",  "MailingCity", "Provincia","Descripci_n_Fuente__c","Medio_Campa_a__c", "Campaña","Contenido_Campa_a__c", "ID Entrada", "Fecha_Ingreso__c","Numero de Tarjeta","Monto_Donacion__c","Vencimiento__c","Fuente__c"}

...然后您可以进行名为“fEnsureRequiredColumns”的查询,这很简单

fTableEnsureColumns(RequiredColumns)

然后您可以确保您的表具有所需的列,方法是通过

fEnsureRequiredColumns{#"Your table here")
为您需要的每个表添加缺失的列,并改用结果表。

当然,这假设空列值不会破坏您的代码,但是如果出现问题,使用 if-thrn 或 try-otherwise 来处理该问题应该不会太难。

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