在 Power Query 中拆分列而不转换为文本?

Posted

技术标签:

【中文标题】在 Power Query 中拆分列而不转换为文本?【英文标题】:Split Column Without Converting to Text in Power Query? 【发布时间】:2021-12-14 00:05:11 【问题描述】:

Initial table

有没有办法将我的单元格拆分为多行而不将我的数据类型转换为文本?使用 Power Query 功能区中的“拆分列”到行功能会将整个列转换为文本,并且我会丢失所需的数据类型值。我已尝试将列转换回类型“任何”,但每个单元格仍保留为文本。

After splitting

【问题讨论】:

这似乎是一个XY 问题。如果您在其他地方使用单元格内容,则可以将其转换。拆分列使用Splitter 函数之一,它们对文本字符串进行操作。将它们转换为文本字符串后,它们将保留该数据类型,除非您将它们转换回来。您需要逐个单元格地执行此操作。 如果你提供一个更大的背景会很有帮助 - 你想整体实现什么?您的初始表看起来很奇怪 - 为什么在一列中有混合数据类型?重组表格可能会解决您的问题,但如果没有更多细节,很难给出建议。 【参考方案1】:

即使您在查询中显示不同的类型,但在加载查询时,它将全部加载为文本(Excel 和 Power BI)。

您的表格格式看起来像未透视的强类型列。如果您将数据转回到具有单一类型的适当列中,这将变得很简单。

在下面的查询中,前三个步骤将您的示例表重新放入正确的列中,每列只有一个类型。

然后我只是通过分隔符分割成行,然后设置类型。

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjKuMa4xNFDSUfLJLC5RitWJVjI2AfL8SnMNwTywHJBnBOYl5ZSmAvnO+Tn5RVBpfWN9Q0tLC6CoS2JJqlJsLAA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Value = _t, Column = _t]),
    #"Pivoted Column" = Table.Pivot(Source, List.Distinct(Source[Column]), "Column", "Value"),
    #"Changed Type" = Table.TransformColumnTypes(#"Pivoted Column","Num1", Int64.Type, "Num2", type number, "Date", type date),
    #"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(#"Changed Type", "List", Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type itemType), "List"),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter","List", Int64.Type)
in
    #"Changed Type1"

如果您需要按列拆分数据,则如下所示:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjKuMa4xNFDSUfLJLC5RitWJVjI2AfL8SnMNwTywHJBnBOYl5ZSmAvnO+Tn5RVBpfWN9Q0tLC6CoS2JJqlJsLAA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Value = _t, Column = _t]),
    #"Pivoted Column" = Table.Pivot(Source, List.Distinct(Source[Column]), "Column", "Value"),
    #"Changed Type" = Table.TransformColumnTypes(#"Pivoted Column","Num1", Int64.Type, "Num2", type number, "Date", type date),
    #"Split Column by Delimiter" = Table.SplitColumn(#"Changed Type", "List", Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv), "List.1", "List.2", "List.3"),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter","List.1", Int64.Type, "List.2", Int64.Type, "List.3", Int64.Type)
in
    #"Changed Type1"

这里的挑战是您必须为拆分选择最大列数。如果已知则容易,否则您可能需要计算“|”的最大数量列中的字符。

【讨论】:

以上是关于在 Power Query 中拆分列而不转换为文本?的主要内容,如果未能解决你的问题,请参考以下文章

Table.SplitColumn拆分…Split…(Power Query 之 M 语言)

允许 Power Query 同时包含文本和数字

Powerbi Power Query Editor 将字符串转换为数字时出错

Power Query 倾斜数据

拆分数据框的列并将它们重新组合为一列而不显示空格

在pandas数据框中搜索文本列而不进行循环