【问题标题】:Is there a formula to transform data from one cell into a table?是否有将数据从一个单元格转换为表格的公式?
【发布时间】:2023-03-20 03:47:01
【问题描述】:

我正在使用 Amazon Mechanical Turk 转录收据数据。亚马逊返回的 CSV 乍一看非常难以阅读。 CSV 文件的 URL:https://drive.google.com/file/d/1QR4cgdVrkYwRni3YM5Dc_umIKFGiX_0k/view?usp=sharing

但是当你将它导入到 excel 中时,将分隔符设置为逗号,它至少是可读的。这是excel文件的URL(请下载并用excel打开,这样会更好):https://drive.google.com/file/d/1Noj4UUMd-p1iYKIWDgKURQUzCdhu5Ck1/view?usp=sharing

然后 Excel 将抄写员的所有答案放在一个名为“Answer.taskAnswers”的单元格中。

期望的结果:像这样的表中的 transciber 的值(检查这个 URL:https://i.ibb.co/vjf0t0c/Prefered-formatting-of-cell-Answer-task-Answers-2.png

可能的解决方案 1:一种格式化 CSV 文件的方法,使其看起来像“期望结果”中的表格。

可能的解决方案 2: 生成另一个“Answer.taskAnswers”表格(可能在另一张纸上)的公式,该表格看起来像“期望结果”中的表格。

有人知道解决这个问题的方法吗?

【问题讨论】:

  • 你可以用公式来走很长的路,但事实是所有 5 种产品的重量都不存在,这使得它变得困难。
  • Answer.taskAnswers 列中的每个单元格都是一个 JSON 文档。这将很难用公式提取。
  • 你可能想试一试#powerquery
  • 您是否使用 Power Query(获取和转换)导入了 CSV?

标签: excel csv excel-formula


【解决方案1】:

编辑: M 代码已更改,以允许 csv JSON 字符串中的列(产品)数量不同

从您输出的外观来看,我猜您使用了Power Query(又名Get & Transform)来输入数据。

如果是这种情况,您可以编辑查询以获得您正在寻找的输出。 (如果没有,你可以在整个过程中使用它)。

您希望从中解析输出的列是 JSON 格式,并且 PQ 有一个内置的解析器。

我根据您提供的原始 CSV 文件工作。

我们删除不相关的列和空白行,解析JSON字符串,然后重新排列数据。

除自定义列公式之外的所有步骤都可以从 GUI 完成。

自定义列公式从相关列中的 JSON 字符串中提取元素:=Json.Document([Answer.taskAnswers])

您可以将 M 代码粘贴到 PQ 的高级编辑器中,然后检查 GUI 中的步骤以查看发生了什么。
您还必须编辑 Source 行以反映您实际获取源数据的位置(可以是 URL 而不是文件)

M-代码

let
    Source = Csv.Document(File.Contents("C:\Users\ron\Desktop\Stackoverflow data for question about cell formating (1).csv"),[Delimiter=",", Columns=31, Encoding=1252, QuoteStyle=QuoteStyle.None]),
    #"Promoted Headers" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    #"Removed Other Columns" = Table.SelectColumns(#"Promoted Headers",{"Answer.taskAnswers"}),
    #"Removed Blank Rows" = Table.SelectRows(#"Removed Other Columns", each not List.IsEmpty(List.RemoveMatchingItems(Record.FieldValues(_), {"", null}))),
    #"Added Custom" = Table.AddColumn(#"Removed Blank Rows", "strJSON", each Json.Document([Answer.taskAnswers])),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Answer.taskAnswers"}),
    #"Expanded strJSON" = Table.ExpandListColumn(#"Removed Columns", "strJSON"),
    #"Expanded strJSON1" = Table.ExpandRecordColumn(#"Expanded strJSON", "strJSON", List.Union(List.Transform(#"Expanded strJSON"[strJSON], each Record.FieldNames(_)))),
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Expanded strJSON1", {"purchaseTime", "purchaseDate", "storeName"}, "Attribute", "Value"),
    #"Split Column by Delimiter" = Table.SplitColumn(#"Unpivoted Other Columns", "Attribute", Splitter.SplitTextByEachDelimiter({"-"}, QuoteStyle.Csv, true), {"Attribute.1", "Attribute.2"}),
    #"Sorted Rows" = Table.Sort(#"Split Column by Delimiter",{{"Attribute.2", Order.Ascending}}),
    #"Pivoted Column" = Table.Pivot(#"Sorted Rows", List.Distinct(#"Sorted Rows"[Attribute.1]), "Attribute.1", "Value"),
    #"Removed Columns1" = Table.RemoveColumns(#"Pivoted Column",{"Attribute.2"}),
    #"Reordered Columns" = Table.ReorderColumns(#"Removed Columns1",{"storeName", "purchaseDate", "purchaseTime", "product", "price", "weight", "quantity"}),
    #"Changed Type" = Table.TransformColumnTypes(#"Reordered Columns",{{"purchaseDate", type date}, {"purchaseTime", type time}, {"price", Currency.Type}, {"quantity", Int64.Type}})
in
    #"Changed Type"

原始 GUI 生成的 M 代码有这行专门命名 JSON 列。它不会适应产品数量的变化。

#"Expanded strJSON1" = Table.ExpandRecordColumn(#"Expanded strJSON", "strJSON", {"price-1", "price-2", "price-3", "price-4", "price-5", "product-1", "product-2", "product-3", "product-4", "product-5", "purchaseDate", "purchaseTime", "quantity-1", "quantity-2", "quantity-3", "quantity-4", "quantity-5", "storeName", "weight-1", "weight-5", "weight-3"}, {"price-1", "price-2", "price-3", "price-4", "price-5", "product-1", "product-2", "product-3", "product-4", "product-5", "purchaseDate", "purchaseTime", "quantity-1", "quantity-2", "quantity-3", "quantity-4", "quantity-5", "storeName", "weight-1", "weight-5", "weight-3"}),

所以我修改了上面 M-Code 中的那一行,以解决这个问题。

输出

GUI 步骤

【讨论】:

  • 这是很多步骤,但做得很出色:) ++。必须说我很难遵循所有步骤(我在 PQ 方面没有那么先进)
  • @JvdV Tks。用更少的步骤可能是可行的,但我也正在尝试让自己了解 PQ,并且在大多数步骤中都使用 GUI。当然,关键是相关列的格式。
  • @RonRosenfeld 你就是那个人!首先是一个很好的解释,我对 PQ 的经验很少,但很好理解。我已经尝试过了,它显示了所需的输出:D.非常感谢!知道我将使用更多 CSV 文件对此进行测试,看看效果如何,我会告诉你的。
  • @T.deJong 希望其他文件格式与您提供的文件格式没有太大区别。它可以使用 VBA 和旧版导入向导导入和拆分,但您似乎可能使用了基于 PQ 的较新向导进行导入,所以我对此进行了扩展。如果其他 CSV 文件有问题,请告诉我。
  • @RonRosenfeld Answer.taskAnswers 中的行数(产品、价格、重量、数量)从 1 到 40 左右不等。当我在 Answer.taskAnswers 中尝试一个包含 10 行的 CSV 时,它只返回第一 5. 是否可以进行查询,以便它可以处理 Answer.taskAnswers 单元格中的可变数量的行? CSV 的其余部分保持不变,只有 id 和 stuff 的值发生变化。
猜你喜欢
  • 2014-05-25
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多