将数据集重塑为更相关的格式(转置一些行并将它们分配给数据子集)

Reshape the dataset into more relational format (Transpose SOME rows and assign them to a data subset)

我有一个 spreadsheet/csv:

Code:,101,Course Description:,"Introduction to Rocket Science",
Student Name,Lecture Hours,Labs Hours,Test Score,Status
John Galt,48,120,4.7,Passed
James Taggart,50,120,4.9,Passed
...

我需要将其重塑为以下视图:

Code:,Course Description:,Students,Lecture Hours,Labs Hours,Average Test Score,Teaching Staff
101,"Introduction to Rocket Science",John Galt,48,120,4.7,Passed
101,"Introduction to Rocket Science",James Taggart,50,120,4.9,Passed
...

信不信由你,尽管这似乎是非常原始的转换,但仍无法得到正确的想法如何做到这一点,是否有解决此问题的灵丹妙药?

原始记录 (csv) 在某种程度上具有类似于 json 的结构,因此我的第一种方法是 将原始数据表示为向量,然后将其转置 , (但在这种情况下,我得到的 table 看起来像 sparced 矩阵 - 我传输的行在其其余值中是空白的) 另一种方式我m considering - **serialize it into jsons and then de-serialize** into new spreadsheet (jsonize()) - in this case, I我在正确合并它们时遇到问题。

两种方式我都有"half-working"; 谁能为此建议简单可靠的算法; 非常感谢任何语言、RegEx、任何工具、代码片段

假设您在此处描述的模式始终保持一致,我认为您可以采用多种不同的方法,但在所有情况下,您基本上都可以使用 'Course' 行开始的事实使用 "Code:" 但这永远不会成为学生姓名。

您可以通过正则表达式 find/replace 或在 OpenRefine 中利用这一点。

示例:

  1. 在支持正则表达式的文本编辑器中打开文件 find/replace
  2. 搜索以 'Code:' 开头的行并在行首添加额外的逗号以将课程数据列移动到 对,例如搜索:^代码:替换为:,^代码:
  3. 如果您现在将文件导入 OpenRefine,那么您将拥有一个包含 10 列的项目(第 10 列是由尾随 课程数据行末尾的逗号)
  4. 您现在可以在包含课程数据的最右边的列上使用转置(或只是重命名),同时保留最左边的列 包含学生详细信息的列
  5. 隔离第一列中包含短语 'Student Name' 的行并删除它们(通过过滤器或分面)
  6. 将课程 Code/Description 列移动到项目的开头,并在每一列上使用 'Edit Cells->Fill Down' 选项以获取在所有相关行上重复的值
  7. 最后根据需要重命名列,删除任何无关的列