Estou usando o Power Query no Excel para Microsoft 365.
Aqui está minha tabela de dados de origem (cujo nome da tabela é Source ):
Col1 | Col2 | Col3 | Col4 | Nome | Alt.Nome |
---|---|---|---|---|---|
11 | 21 | 31 | 41 | Cachorro | Fido |
12 | 22 | 32 | 42 | Gato | Fofinho |
23 | 33 | 43 | Avestruz | janeiro | |
14 | 24 | 44 | Periquito | Prumo | |
15 | 25 | 35 | 45 | Truta | Cindy |
Eu defini dois parâmetros de texto:
ColToKeep
especifica qual das colunasCol1
,Col2
,Col3
eCol4
manter. As colunas não especificadas serão descartadas.NameToKeep
especifica qual das colunasName
deveAlt.Name
ser mantida. A coluna não especificada será descartada.
Meu objetivo é desenvolver uma Power Query para:
- Remova todas as colunas, exceto as duas especificadas por
ColToKeep
eNameToKeep
- Filtre as linhas onde há um nulo na coluna especificada por
ColToKeep
Supondo que eu configurei ColToKeep
como Col3 e que configurei NameToKeep
como Alt.Name , o resultado desejado é:
Col3 | Alt.Nome |
---|---|
31 | Fido |
32 | Fofinho |
33 | janeiro |
35 | Cindy |
No entanto, o resultado real ( incorreto ) é:
Col3 | Alt.Nome |
---|---|
31 | Fido |
32 | Fofinho |
33 | janeiro |
Prumo | |
35 | Cindy |
Aqui está o código da linguagem M para meu Power Query:
let
Source = Excel.CurrentWorkbook(){[Name="Source"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Col1", Int64.Type}, {"Col2", Int64.Type}, {"Col3", Int64.Type}, {"Col4", Int64.Type}, {"Name", Text.Type}, {"Alt.Name", Text.Type}}),
#"Removed Other Columns" = Table.SelectColumns(#"Changed Type",{ColToKeep, NameToKeep}),
// #"Filtered Rows" = Table.SelectRows(#"Removed Other Columns", each [ColToKeep] <> null and [ColToKeep] <> "")
// #"Filtered Rows" = Table.SelectRows(#"Removed Other Columns", each ColToKeep <> null and ColToKeep <> "")
// #"Filtered Rows" = Table.SelectRows(#"Removed Other Columns", each Table.ColumnNames(#"Removed Other Columns"){0} <> null and Table.ColumnNames(#"Removed Other Columns"){0} <> "")
in
#"Filtered Rows"
É a etapa aplicada #"Filtered Rows" que está dando errado. No código acima, mostro três tentativas (comentadas) que fiz para implementar esta etapa aplicada.
Na primeira tentativa, simplesmente me refiro diretamente aos nomes das colunas (com colchetes). No entanto, ColToKeep
e NameToKeep
são considerados referências às colunas de interesse, não como sequências de texto que contêm os nomes das colunas. Um erro é gerado porque, por exemplo, não há coluna chamada ColToKeep .
Na segunda tentativa, novamente me refiro diretamente aos nomes das colunas, mas desta vez sem colchetes. Isso não gera um erro, mas recebo a saída incorreta mostrada acima.
Na terceira tentativa, refiro-me às colunas pela sua posição, pois não sei até o tempo de execução quais colunas estão sendo mantidas. Após a execução da etapa aplicada #"Removed Other Columns" anterior , restarão duas colunas. Presumi que seus índices de posição seriam 0 e 1, mas suspeito que os índices de posição ainda não tenham sido ajustados quando a Table.SelectRows
chamada for executada e que, portanto, não estou fazendo referência à coluna que pretendo ao filtrar valores nulos . Isso não gera um erro, mas gera a saída incorreta mostrada acima.
Como posso filtrar linhas com base em valores nulos na coluna nomeada pelo parâmetro ColToKeep
?
Solte temporariamente os cabeçalhos para a primeira linha, que numerará as colunas como 1 e 2, depois filtre os nulos e promova novamente a primeira linha como cabeçalhos: