如何用Power Query将多列问卷数据高效转换为Power BI模型?
用Power Query一步生成AnswerHistory表的方案
完全不需要重复拆分再合并,利用Power Query的逆透视+透视组合操作(可封装为单步M代码)就能实现,具体操作如下:
- 导入CSV数据进入Power Query编辑器后,选中所有非问卷字段列(如ClientID、MemberID、DateCompleted、年龄等)
- 点击「转换」选项卡 →「逆透视列」→「逆透视其他列」,此时会生成
Attribute(存储Question1/Answer1/Score1这类列名)和Value(对应字段值)两列 - 添加自定义列提取问题编号:
QuestionID = Number.From(Text.Range([Attribute], Text.Length([Attribute])-1))(若列名格式不是末尾带数字,可改用Text.AfterDelimiter([Attribute], "Question")这类函数调整) - 添加自定义列区分字段类型:
FieldType = Text.BeforeDelimiter([Attribute], Text.From([QuestionID]))(提取出Question、Answer、Score) - 选中
MemberID、DateCompleted、QuestionID及所有标识列,点击「转换」→「透视列」,将FieldType作为透视依据,Value作为值列,聚合方式选择「不要聚合」 - 删除中间生成的
Attribute列,即可得到结构规范的AnswerHistory表:包含所有标识列、QuestionID、Answer、Score
如果要实现真正的单步操作,可将上述逻辑封装为M代码,直接粘贴到Power Query高级编辑器替换默认代码即可:
let 源 = Csv.Document(File.Contents("你的CSV文件路径"), [Delimiter=",", Encoding=65001, QuoteStyle=QuoteStyle.Csv]), 提升标题 = Table.PromoteHeaders(源, [PromoteAllScalars=true]), 逆透视其他列 = Table.UnpivotOtherColumns(提升标题, {"ClientID", "MemberID", "DateCompleted", "Age"}, "Attribute", "Value"), 添加QuestionID = Table.AddColumn(逆透视其他列, "QuestionID", each Number.From(Text.Range([Attribute], Text.Length([Attribute])-1))), 添加FieldType = Table.AddColumn(添加QuestionID, "FieldType", each Text.BeforeDelimiter([Attribute], Text.From([QuestionID]))), 透视列 = Table.Pivot(添加FieldType, List.Distinct(添加FieldType[FieldType]), "FieldType", "Value"), 删除列 = Table.RemoveColumns(透视列,{"Attribute"}) in 删除列
内容的提问来源于stack exchange,提问作者yonabout
相关产品推荐
相关产品推荐

