¿Cambio condicional al nombre de la columna? – nomenclatura de fuente inconsistente

Un usuario Pregunto ✅

McSarah

Hola,

Estoy trabajando con la salida del informe de Excel como mi entrada de informe de Power Query (no es divertido), y mi informe debe poder consumir informes antiguos, así como informes recientes. Hoy me sorprendió un cambio de nombre en el nombre de una columna en la ejecución de hoy del informe de origen.

¿Hay alguna manera de que pueda insertar un paso condicional en el editor avanzado, donde detecto si el informe usa el nombre anterior y luego actualizo el nombre de la columna solo si está presente? Podría hacer esto comprobando los nombres de las columnas o comprobando la convención de nomenclatura en el archivo fuente, ya que incluye la fecha de ejecución y sé la fecha en que ocurrió el cambio.

McSarah

En respuesta a McSarah

Solución final —

Eliminé esta cláusula del código:

cada Text.Contains(_, «ChangeThisSubstring»))),

Esta es la condición que estaba causando la falla, ya que mis datos de origen no siempre contenían instancias de «ChangeThisSubstring». Con la condición eliminada, esto significaba que mi tabla de reemplazo de nombre de columna «#Added Custom» ahora tenía una línea para cada columna en mis datos, no solo las columnas que necesitaban ser reemplazadas, sino que para otras columnas, el nombre «nuevo» era el igual que el nombre anterior ya que las reglas Text.Replace no los afectaron.

Luego, al darme cuenta de que {0} era un índice para qué columna reemplazar, codifiqué la columna que quería actualizar usando el índice de esa columna:

Renombrar = Table.RenameColumns(#»Encabezados promocionados», Record.ToList(Table.ToRecords(#»Custom Added»){8}))

Ahora, el nombre del índice siempre se «cambia» a la versión Text.Replace cada vez que se cargan los datos. Si se necesita un nombre de columna, se cambia a la versión actualizada. Si ya es la versión actualizada, simplemente cambia a una copia del nombre original.

lbendlin

Sí, hay funciones de Power Query para enumerar los nombres de las columnas.

https://docs.microsoft.com/en-us/powerquery-m/table-columnnames

Puede evaluar la lista y luego decidir si alguno de ellos necesita cambiar el nombre.

También desea usar Table.SelectColumns en lugar de Table.RemoveColumns al elegir qué conservar.

McSarah

En respuesta a lbendlin

Hola, tengo una solución parcial basada en tu comentario y en este hilo: https://community.powerbi.com/t5/Desktop/Rename-Columns-with-IF-formula/td-p/325573

Sin embargo, esta solución solo funciona cuando la columna a la que quiero cambiar el nombre está presente en la tabla de origen. ¿Qué sucede si necesito consumir una versión anterior de los datos de origen donde no es necesario cambiar el nombre? Básicamente, mi caso es que tengo que cambiar entre diferentes versiones de los datos subyacentes de Excel y cambiaron el nombre de la columna para las tablas recientes. Creo que debo verificar si la tabla #»Added Custom» es nula (en el código a continuación), y si lo es, necesito el código para omitir el siguiente paso de Renombrar.

Aquí está mi código:

dejar
Fuente = Excel.Workbook(File.Contents(FolderPathParameter&FileParamater), nulo, verdadero),
#»BA Level_Sheet» = Fuente{[Item=»SourceExcelTab»,Kind=»Sheet»]}[Data],
#»Encabezados promocionados» = Table.PromoteHeaders(#»SourceExcelTab», [PromoteAllScalars=true]),
#»Obtener nombres de columnas» = Table.FromList(List.Select(Table.ColumnNames(#»Promoted Headers»),each Text.Contains(_, «ChangeThisSubstring»))),
#»Personalizado agregado» = Table.AddColumn(#»Obtener nombres de columnas», «Personalizado», cada Texto.Reemplazar([Column1],»CambiarEstaSubcadena»,»NuevaSubcadena») ),
Renombrar = Table.RenameColumns(#»Encabezados promocionados», Record.ToList(Table.ToRecords(#»Custom Added»){0}))

en
Rebautizar

McSarah

En respuesta a McSarah

Solución final —

Eliminé esta cláusula del código:

cada Text.Contains(_, «ChangeThisSubstring»))),

Esta es la condición que estaba causando la falla, ya que mis datos de origen no siempre contenían instancias de «ChangeThisSubstring». Con la condición eliminada, esto significaba que mi tabla de reemplazo de nombre de columna «#Added Custom» ahora tenía una línea para cada columna en mis datos, no solo las columnas que necesitaban ser reemplazadas, sino que para otras columnas, el nombre «nuevo» era el igual que el nombre anterior ya que las reglas Text.Replace no los afectaron.

Luego, al darme cuenta de que {0} era un índice para qué columna reemplazar, codifiqué la columna que quería actualizar usando el índice de esa columna:

Renombrar = Table.RenameColumns(#»Encabezados promocionados», Record.ToList(Table.ToRecords(#»Custom Added»){8}))

Ahora, el nombre del índice siempre se «cambia» a la versión Text.Replace cada vez que se cargan los datos. Si se necesita un nombre de columna, se cambia a la versión actualizada. Si ya es la versión actualizada, simplemente cambia a una copia del nombre original.

lbendlin

En respuesta a McSarah

Tenga en cuenta que {8} es una referencia de fila, no una referencia de columna.

McSarah

En respuesta a lbendlin

Sí, supongo que es correcto, pero es una referencia de fila a la tabla personalizada de nombres de columnas. De todos modos, cuando especifiqué el nombre de columna correcto (fila) en el script, intercambió correctamente el nombre de columna correcto (columna) en la tabla externa. Tal vez hay matices que no entiendo completamente, pero esto parece funcionar.

lbendlin

En respuesta a McSarah

dos opciones

1. use la lista Table.Columnnames para averiguar si una columna en particular está presente o no.

2. Familiarícese con el concepto de prueba… de lo contrario… de Power Query. Luego fuerza bruta tu camino a través del cambio de nombre.

McSarah

En respuesta a lbendlin

Suena prometedor, gracias. Voy a mirar esto.

mahoneypat

En respuesta a McSarah

Aprender acerca de probar … de lo contrario, definitivamente será útil. Para su información, también hay un parámetro opcional en las columnas de cambio de nombre llamado MissingField. Ignore que también puede ser útil (es decir, no hay error si intenta cambiar el nombre de una columna que no está allí).

https://docs.microsoft.com/en-us/powerquery-m/table-renamecolumns

Si esto funciona para usted, por favor márquelo como la solución. También se agradecen los elogios. Por favor, hágamelo saber si no.

Saludos,

Palmadita

McSarah

En respuesta a mahoneypat

Gracias por ayudar con esto. Hice que esto funcionara aplicando mi lógica Text.Replace a todos los nombres de columna, no solo a aquellos que realmente tienen la subcadena que necesita cambiarse (eliminando la cláusula que especifica obtener solo columnas con la subcadena). Con este cambio, mi tabla personalizada nunca es nula/nunca se genera un error, y la tabla personalizada que procesa el cambio de nombre (OldName, NewName) simplemente tiene un duplicado de OldName cuando la subcadena no está presente. Por último, especifiqué el índice de columna de las columnas para «cambiar» a NewName.

Sin embargo, me interesa saber si crees que intentarlo… de lo contrario, habría sido un mejor enfoque.

McSarah

En respuesta a lbendlin

gracias, voy a echar un vistazo a esto y volver a informar.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *