将多个表和一些常用字段组合到一个选项卡中

2024-09-30 01:23:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一系列文本文件(每年一份),其中包含年度调查/问卷的答案。文件中的列标题指的是问题编号,每行代表一个人对问题的答案,例如

Q1,   Q2,   Q3, ...
P1A1, P1A2, P1A3, ...
P2A1, P2A2, P2A3, ...
etc.
[where Q1 is Question 1, P1 is Person 1 and A1 is Answer 1].

问卷每年使用相同的核心问题集,但每年都会增加新问题,并删除一些旧问题。因此,我的表有许多共同的字段,但它们并不都是相同的

^{pr2}$

在本例中,Q1和Q2是核心问题,而Qs 3、4和5取决于调查年份。在

删除的问题编号永远不会重复使用:如果添加了一个新的问题,它将被赋予一个全新的编号。真正的调查有300到500个问题,每年大约有4万人回答。在

我想将所有这些数据合并到一个表中,其中的列标题将是原始文件中的一组不同的标题,再加上一个表示年份的列。多年来,当一个问题不相关的时候,我希望有空的,例如

Year,  Q1,   Q2,   Q3,   Q4,   Q5
1,     P1A1, P1A2, P1A3, Null, Null
1,     P2A1, P2A2, P2A3, Null, Null
2,     P1A1, P1A2, Null, P1A4, Null
2,     P2A1, P2A2, Null, P2A4, Null
3,     P1A1, P1A2, Null, Null, P1A5
3,     P2A1, P2A2, Null, Null, P2A5

本质上,我只想在它们匹配的地方添加列,否则会有空值,但是如果可能的话,我希望自动(从输入表)为最终表生成一组列标题,因为调查中的问题数量很大,并且得出并键入Create Table语句的前景非常可怕!我想我想要的是UNION ALL上的某种变体,它不需要我按顺序指定所有列,并且可以处理不匹配的列。在

有人有什么建议吗?我最初希望使用SQLite,但我愿意尝试几乎任何东西。我不是数据库专家,但我对SQL有基本的了解,如果有帮助的话,我可以做一些Python脚本。在

如果你能做到这一点,谢谢你的阅读!我原以为这是一个非常简单的问题,但很难详细描述。在


Tags: 文件答案标题isnull编号问卷q3
3条回答

第一个SQLite不会有更大的DBMS的奇特特性。如果您不想为每个问题编写一个select语句片段,那么您需要一个pivot表,而SQLite没有。在

最初的格式很混乱-我将创建一个包含Person、Question、Answer和Year列的表。(分析出人和问题编号)然后从那里开始。如果不起作用,请在单个表中使用原始格式。因此,计算最后一个表是很容易用Python而不是SQL来完成的

下面是一个简单的sudo代码草图,只使用基本的python代码

有一个所有“条目”的主列表

  • 阅读文件的第一行,找出所有问题
  • 创建一个set()并将所有年份的问题添加到集合中
  • 创建一个以“键”作为问题的字典
  • 另外添加一个关键的人的名字和年份
  • 为每个人加载一个新字典并将其添加到您的列表中
  • 对每个文件都这样做,因为你有一个字典列表
  • 为自己创建一个格式化函数,该函数要求元素_list.has\u键(“问题集中的一个问题”)。。。如果是,很好,如果不是,请打印“无”或w/e

您的问题集()应强制转换为list()以在最终输出中保持顺序

[
  {"year":"2001","name":"bob","q1":"hello"}
  {"year":"2011","name":"rob","q5":"world"}
]

第1步。停止编码。在

第二步。买一本关于数据仓库和星型模式设计的书。例如,拉尔夫·金博尔的数据仓库工具包。http://www.amazon.com/Data-Warehouse-Toolkit-Complete-Dimensional/dp/0471200247

第三步。设计一个合适的星型模式。问题是一个维度。时间(特别是年份)是一个维度。回答者(如果你认识他们)是一个维度。响应(单个调查工具)是一个维度。事实是在给定的一年里问题的答案。每项调查都会变成多行事实。在

第4步。用不同年份的数据加载星型模式。这些维度(问题)的加载有点复杂,因为每年都会重复使用一些问题并添加新的问题。一旦维度被加载,事实行就很容易加载。在

第5步。现在,您可以编写一个快速报告应用程序,从各种事实行中提取所需的数据并组装所需的报告。在

相关问题 更多 >

    热门问题