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

时间:2017-06-22 12:23:36

标签: json regex csv vim openrefine

我有一个电子表格/ 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的结构,所以我的第一种方法是将原始数据表示为向量然后转置它,(但在这种情况下,我的结果表看起来很像像sparced矩阵 - 我已经传输的行在其余值中是空白的) 我m considering - **serialize it into jsons and then de-serialize** into new spreadsheet (jsonize()) - in this case, I遇到合并问题的另一种方法。

在两种方式中我都有它"半工作&#34 ;; 任何人都可以建议简单可靠的算法; 任何语言,RegEx,任何工具,代码片段都非常受欢迎

1 个答案:

答案 0 :(得分:1)

假设您在此描述的模式始终如一,我认为您可以采取不同的方法,但在所有情况下,您基本上都可以使用“#Course”' ;行以&#34开头;代码:"但那永远不会成为学生的名字。

您可以通过正则表达式查找/替换或在OpenRefine中利用此功能。

示例:

  1. 在支持正则表达式的文本编辑器中打开文件 查找/替换
  2. 搜索以'代码开头的行:'并在行的开头添加其他逗号,以将课程数据列移至 对,例如搜索:^代码:替换为:,,,,, ^代码:
  3. 如果您现在将文件导入OpenRefine,那么您将拥有一个包含10列的项目(第10列是由尾随引起的 课程数据行末尾的逗号)
  4. 您现在可以在包含课程数据的最右侧列上使用转置(或仅重命名),同时保留最左侧 包含学生详细信息的列
  5. 隔离包含短语'学生姓名'的行。在第一列中删除它们(通过过滤器或小平面)
  6. 将课程代码/说明列移至项目的开头,然后使用'编辑单元格>向下填写'每列上的选项以获取在所有相关行上重复的值
  7. 最后根据需要重命名列,删除任何无关的列