Quitar columnas que contengan un cierto valor

Un usuario Pregunto ✅

tc5pt

Tengo varias columnas que tienen una fecha en una fila, por lo que contienen «https://community.powerbi.com/». Ninguna de las otras columnas que necesito contiene una barra invertida en ninguna de las filas. Me gustaría eliminar las columnas que contienen esta barra invertida.

Vi un hilo que propone la siguiente fórmula pero tengo dificultades para aplicarla a mi consulta. Me dice «PreviousStepName no reconocido». Lo reemplacé con el nombre del paso anterior en mi consulta, pero eso no funcionó. ¿Se supone que debo completar valores para «ColumnNames» y otras partes de esta fórmula también? ¿O esta fórmula no es precisa para lo que estoy tratando de lograr?

= let columnasParaEliminar = List.Select(Table.ColumnNames(PreviousStepName), cada Text.StartsWith(_, «Var») o Text.Contains(_, «_prep»)) en Table.RemoveColumns(PreviousStepName, columnToRemove)

También encontré un hilo que sugería transponer mis datos y luego eliminar filas, pero esta no era una buena solución para mis datos.

Gracias

Sin bloqueo

En respuesta a tc5pt

Hola @tc5pt,

Intenté integrarlo en el código que mencionaste anteriormente. Simplemente reemplace todas las apariciones de «Fuente» con #»Encabezados promocionados» y debería funcionar en su archivo de Excel.

let
    Source = Excel.Workbook(File.Contents("C: Source"), null, true),
    #"1_Sheet" = Source{[Item="1",Kind="Sheet"]}[Data],
    #"Promoted Headers" = Table.PromoteHeaders(#"1_Sheet", [PromoteAllScalars=true]),

// get columns which contains any slash among values
    ColumnsToRemove = 
        List.Select(
            // get a list of all columns
            Table.ColumnNames(#"Promoted Headers"),
            (columnName) =>
                let
                    // get all values of a columns
                    ColumnValues = Table.Column(#"Promoted Headers", columnName),
                    // go through values and stop when you find the first occurence of a text containing a slash
                    // if there is a value with a slash, return true else false
                    ContainsSlash = List.AnyTrue(List.Transform(ColumnValues, each Text.Contains(_, "https://community.powerbi.com/")))
                in
                    ContainsSlash
        ),
    // remove columns
    Result = Table.RemoveColumns(#"Promoted Headers", ColumnsToRemove)
in
    Result

Sin bloqueo

Hola @tc5pt,

Solo estoy adivinando: debe reemplazar todas las ocurrencias de PreviousStepName. En tu caso tienes que reponerlo dos veces.

let 
    PreviousStepName = <THE NAME OF PREVIOUS STEP>,
    columnsToRemove = List.Select(Table.ColumnNames(PreviousStepName), each Text.StartsWith(_, "Var") or Text.Contains(_, "_prep")) 
in 
    Table.RemoveColumns(PreviousStepName, columnsToRemove)

Pero supongo que también puede haber otro problema porque tu código comienza con «=». Por favor, publique la consulta completa para ver si la usa correctamente.

tc5pt

En respuesta a Sin bloqueo

Gracias por tu respuesta @Nolock

¿Dónde exactamente ingreso este código? ¿En el Editor avanzado? Cuando hago eso, me da Token Comma o Token Eof esperado. No estoy seguro de cómo ingresar este código.

Sin bloqueo

En respuesta a tc5pt

Hola @tc5pt,

jep, en el Editor avanzado. Publique su consulta de PowerQuery (sin datos) y lo ayudaré a integrar el código.

El mensaje de error significa que falta una coma o tal vez una al final del código antes del último IN o algo similar.

tc5pt

En respuesta a Sin bloqueo

@Nolock

let
    Source = Excel.Workbook(File.Contents("C: Source"), null, true),
    #"1_Sheet" = Source{[Item="1",Kind="Sheet"]}[Data],
    #"Promoted Headers" = Table.PromoteHeaders(#"1_Sheet", [PromoteAllScalars=true])
in
    #"Promoted Headers"

Esto es lo que está actualmente en mi editor avanzado. También cambió el tipo de forma predeterminada, pero eliminé ese paso porque había más de 100 columnas y creó un gran bloque de código.

¿Cómo inyectaría el código que diste?

Sin bloqueo

En respuesta a tc5pt

Hola @tc5pt,

aquí vamos:

let
    Source = Excel.Workbook(File.Contents("C: Source"), null, true),
    #"1_Sheet" = Source{[Item="1",Kind="Sheet"]}[Data],
    #"Promoted Headers" = Table.PromoteHeaders(#"1_Sheet", [PromoteAllScalars=true]),
    columnsToRemove = List.Select(Table.ColumnNames(#"Promoted Headers"), each Text.StartsWith(_, "Var") or Text.Contains(_, "_prep")),
    result = Table.RemoveColumns(#"Promoted Headers", columnsToRemove)
in
    result

tc5pt

En respuesta a Sin bloqueo

@Nolock

Esto no parece estar funcionando y no estoy seguro de por qué. El tipo de datos de las columnas es texto. Me he asegurado de no agregar ningún paso entre (es decir, no se ha agregado ningún código adicional). ¿Algunas ideas?

picante

En respuesta a tc5pt

Hola, mira el ejemplo de código que proporcionaste primero y el requisito. No hacen lo mismo. El ejemplo de código busca nombres de columna que comiencen con «Var» o que contengan «_prep» y elimina la columna.

@Nolock (respeto por la contribución que hace a este sitio) lo ayudó a eliminar los errores de sintaxis y, creo, asumió que el código de muestra era lo que quería.

Creo (corríjame si me equivoco) que desea eliminar columnas donde hay un valor de fila que tiene «https://community.powerbi.com/».

Entonces, si los datos se vieran así:

columna 1 columna 2 columna 3

A GRATUITO 6/2/2019

joe 23/4 x

sd gt y

desea eliminar las columnas 2 y 3. ¿Sí?

tc5pt

En respuesta a picante

Ya cambié esa parte del código. Cambié la fuente y los nombres de elementos/hojas para la publicación y también los volví a cambiar.

Y sí, eso es correcto. ¿Quizás no es el código correcto para ese propósito?

Gracias @HotChilli

Sin bloqueo

En respuesta a tc5pt

Hola @tc5pt y @HotChilli,

Lo siento mucho, entendí mal la tarea al principio.

He escrito otro código que elimina las columnas que tienen al menos un valor que contiene una barra inclinada.

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WSlTSUUrUB5FJQKwUqxMNZoBwsn4KTCgZxNBRMtQ3AovEAgA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Column1 = _t, Column2 = _t, Column3 = _t, Column4 = _t]),
    // get columns which contains at least one value which contains a slash
    ColumnsToRemove = 
        List.Select(
            // get a list of all columns of the table Source
            Table.ColumnNames(Source),
            (columnName) =>
                let
                    // get all values of a column
                    ColumnValues = Table.Column(Source, columnName),
                    // go through values and stop when you find the first occurence of a text containing a slash
                    // if there is a value with a slash, return true else false
                    ContainsSlash = List.AnyTrue(List.Transform(ColumnValues, each Text.Contains(_, "https://community.powerbi.com/")))
                in
                    ContainsSlash
        ),
    // remove columns
    Result = Table.RemoveColumns(Source, ColumnsToRemove)
in
    Result

tc5pt

En respuesta a Sin bloqueo

Gracias. Probaré esto. ¿Necesito reemplazar ciertas palabras allí, como «fuente»?

Soy un novato total, así que pido disculpas si es obvio.

Gracias @Nolock

Sin bloqueo

En respuesta a tc5pt

Hola @tc5pt,

Intenté integrarlo en el código que mencionaste anteriormente. Simplemente reemplace todas las apariciones de «Fuente» con #»Encabezados promocionados» y debería funcionar en su archivo de Excel.

let
    Source = Excel.Workbook(File.Contents("C: Source"), null, true),
    #"1_Sheet" = Source{[Item="1",Kind="Sheet"]}[Data],
    #"Promoted Headers" = Table.PromoteHeaders(#"1_Sheet", [PromoteAllScalars=true]),

// get columns which contains any slash among values
    ColumnsToRemove = 
        List.Select(
            // get a list of all columns
            Table.ColumnNames(#"Promoted Headers"),
            (columnName) =>
                let
                    // get all values of a columns
                    ColumnValues = Table.Column(#"Promoted Headers", columnName),
                    // go through values and stop when you find the first occurence of a text containing a slash
                    // if there is a value with a slash, return true else false
                    ContainsSlash = List.AnyTrue(List.Transform(ColumnValues, each Text.Contains(_, "https://community.powerbi.com/")))
                in
                    ContainsSlash
        ),
    // remove columns
    Result = Table.RemoveColumns(#"Promoted Headers", ColumnsToRemove)
in
    Result

Deja un comentario

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