【发布时间】:2021-04-10 18:23:37
【问题描述】:
背景: 下表包含材料 A、B、C 等相关文件的示例数据(文件名称为 MSDS、RMQ、COA、技术数据表)。来自这些文件的信息文件包括日期、重金属杂质和残留溶剂杂质及其含量,以 ppm(百万分之几)为单位。
我使用 power query 对这些数据进行了排序,以便生成下图中显示的 2 个表。
这些包含在文档中发现的最高量的重金属(蓝色)和残留溶剂(黄色)以及包含此值的文档的来源。为了复制电子表格,我在底部提供了(相当广泛的)M 代码。虽然对于这个问题非常简单; “Heavy Metals”和“Residual Solvents”是用来分隔数据的短语。
小问题: 尽管对表格的功能感到满意,但我并不认为“拆分列的拆分”(参见 M 代码)是分离数据的完全令人满意的解决方案。随后我意识到,如果一个单元格意外不包含“重金属”作为分隔符,逻辑将导致该单元格的残留溶剂数据丢失(如单元格 4E 的情况(材料 C,技术数据表))。
我可能会坚持要求那些使用此电子表格的人确保这些短语始终存在,但是我想在这里询问是否有人对提供的 M 代码有任何聪明的替代方案,以便尽管没有分隔符的情况下重金属可能会丢失(或者如果拼写不正确),残留溶剂仍会通过。
我很欣赏这对某人来说是一项相当艰巨的工作,幸运的是这是一个相对较小的问题,因此任何建议都只是一个奖励。我也只是通过它非常有趣地展示了如何使用 power query 来拆分单元格内看似复杂的数据。另请注意,表中的数据“杂乱无章”,以测试这是否会导致任何问题。
M 代码: 这是残留溶剂表的代码。 Power 查询将数据拆分为重金属和残留溶剂,然后根据表格删除相应的列。
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Material", type text}, {"MSDS", type text}, {"RMQ", type text}, {"COA", type text}, {"Technical Data Sheet", type text}}),
//Clean Up user Input (removed additional Spaces)
#"Trimmed Text" = Table.TransformColumns(#"Changed Type",{{"Material", Text.Trim, type text}, {"MSDS", Text.Trim, type text}, {"RMQ", Text.Trim, type text}, {"COA", Text.Trim, type text}, {"Technical Data Sheet", Text.Trim, type text}}),
//Split Data into Date, Heavy Metals and Residual Solvents
//MSDS
#"Split MSDS by Heavy Metals" = Table.SplitColumn(#"Trimmed Text", "MSDS", Splitter.SplitTextByDelimiter("Heavy Metals", QuoteStyle.Csv), {"MSDS Date", "MSDS Heavy Metals"}),
#"Split MSDS by Residual Solvents" = Table.SplitColumn(#"Split MSDS by Heavy Metals", "MSDS Heavy Metals", Splitter.SplitTextByDelimiter("Residual Solvents", QuoteStyle.Csv), {"MSDS Heavy Metals", "MSDS Residual Solvents"}),
// RMQ
#"Split RMQ by Heavy Metals" = Table.SplitColumn(#"Split MSDS by Residual Solvents", "RMQ", Splitter.SplitTextByDelimiter("Heavy Metals", QuoteStyle.Csv), {"RMQ Date", "RMQ Heavy Metals"}),
#"Split Column by Residual Solvents" = Table.SplitColumn(#"Split RMQ by Heavy Metals", "RMQ Heavy Metals", Splitter.SplitTextByDelimiter("Residual Solvents", QuoteStyle.Csv), {"RMQ Heavy Metals", "RMQ Residual Solvents"}),
//COA
#"Split COA by Heavy Metals" = Table.SplitColumn(#"Split Column by Residual Solvents", "COA", Splitter.SplitTextByDelimiter("Heavy Metals", QuoteStyle.Csv), {"COA Date", "COA Heavy Metals"}),
#"Split COA by Residual Solvents" = Table.SplitColumn(#"Split COA by Heavy Metals", "COA Heavy Metals", Splitter.SplitTextByDelimiter("Residual Solvents", QuoteStyle.Csv), {"COA Heavy Metals", "COA Residual Solvents"}),
//Technical Data Sheet
#"Split Technical Data Sheet by Heavy Metals" = Table.SplitColumn(#"Split COA by Residual Solvents", "Technical Data Sheet", Splitter.SplitTextByDelimiter("Heavy Metals", QuoteStyle.Csv), {"Technical Data Sheet Date", "Technical Data Sheet Heavy Metals"}),
#"Split Technical Data Sheet by Residual Solvents" = Table.SplitColumn(#"Split Technical Data Sheet by Heavy Metals", "Technical Data Sheet Heavy Metals", Splitter.SplitTextByDelimiter("Residual Solvents", QuoteStyle.Csv), {"Technical Data Sheet Heavy Metals", "Technical Data Sheet Residual Solvents"}),
//Changes Data to date type
#"Changed Type1" = Table.TransformColumnTypes(#"Split Technical Data Sheet by Residual Solvents",{{"MSDS Date", type date}, {"RMQ Date", type date}, {"COA Date", type date}, {"Technical Data Sheet Date", type date}}),
//Remove Date (add // to add date back into data)
#"Removed Date" = Table.RemoveColumns(#"Changed Type1",{"MSDS Date", "RMQ Date", "COA Date", "Technical Data Sheet Date"}),
//Clean up unnecessary line breaks
#"Trimmed Text1" = Table.TransformColumns(#"Removed Date",{{"Material", Text.Trim, type text}, {"MSDS Heavy Metals", Text.Trim, type text}, {"MSDS Residual Solvents", Text.Trim, type text}, {"RMQ Heavy Metals", Text.Trim, type text}, {"RMQ Residual Solvents", Text.Trim, type text}, {"COA Heavy Metals", Text.Trim, type text}, {"COA Residual Solvents", Text.Trim, type text}, {"Technical Data Sheet Heavy Metals", Text.Trim, type text}, {"Technical Data Sheet Residual Solvents", Text.Trim, type text}}),
#"Removed Columns" = Table.RemoveColumns(#"Trimmed Text1",{"MSDS Heavy Metals", "RMQ Heavy Metals", "COA Heavy Metals", "Technical Data Sheet Heavy Metals"}),
#"Renamed Columns" = Table.RenameColumns(#"Removed Columns",{{"MSDS Residual Solvents", "MSDS"}, {"RMQ Residual Solvents", "RMQ"}, {"COA Residual Solvents", "COA"}, {"Technical Data Sheet Residual Solvents", "Technical Data Sheet"}}),
//Unpivot data into columns, split and clean up as necessary necessary
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Renamed Columns", {"Material"}, "Source", "Amount"),
#"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(#"Unpivoted Other Columns", {{"Amount", Splitter.SplitTextByDelimiter("#(lf)", QuoteStyle.None), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Amount"),
#"Changed Type2" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Amount", type text}}),
#"Trimmed Text2" = Table.TransformColumns(#"Changed Type2",{{"Amount", Text.Trim, type text}}),
#"Split Column by Delimiter1" = Table.SplitColumn(#"Trimmed Text2", "Amount", Splitter.SplitTextByEachDelimiter({" "}, QuoteStyle.Csv, true), {"Heavy Metal", "Amount"}),
#"Changed Type3" = Table.TransformColumnTypes(#"Split Column by Delimiter1",{{"Heavy Metal", type text}, {"Amount", Int64.Type}}),
// if date is to be included add this line
//{"Date", (t) => t[Date]{List.PositionOf(t[Amount],List.Max(t[Amount]))}, type date}
//Group rows by Material and Metal
//Extract the highest amount and corresponding source
#"Grouped Rows" = Table.Group(#"Changed Type3", {"Material", "Heavy Metal"}, {
{"Amount", each List.Max([Amount]),type number},
{"Source", (t) => t[Source]{List.PositionOf(t[Amount],List.Max(t[Amount]))}, type text}
})
in
#"Grouped Rows"
文件链接:
【问题讨论】:
-
我不明白。您编写“此单元格的残留溶剂数据将丢失”,但 E4 中的溶剂似乎确实列在您的第二个结果表中。
-
如果您能提供可以复制/粘贴到 Excel 工作表中的数据来说明问题,那将会很有帮助。
-
啊抱歉,我一定是在拍照前没有刷新数据。我现在会更新这张照片,但你会看到甲苯、DMSO 和甲醇消失了
-
@RonRosenfeld 我不确定如何轻松共享数据,所以我暂时将一个驱动器链接添加到文件本身。希望这会让事情变得更容易。
标签: excel split office365 powerquery delimiter