将几个表与一些公共字段组合到一个表中

时间:2011-09-28 21:20:16

标签: python sql sqlite

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

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

调查问卷每年使用相同的核心问题集,但每年都会添加新问题,并删除一些旧问题。因此,我的表格有很多共同的领域,但它们并不完全相同,例如。

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

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

删除的问题编号永远不会被重复使用:如果添加了新问题,则会给出一个全新的编号。真实的调查有300到500个问题,每年大约有40,000人回答。

我想将所有这些数据合并到一个表中,其列标题将是原始文件中的一组不同标题,以及一年中的列。多年来,如果一个问题无关紧要,我希望有一些空白,例如

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脚本。

如果你已经做到这一点,感谢阅读!我认为这将是一个非常简单的问题,但很难详细描述。

3 个答案:

答案 0 :(得分:2)

步骤1.停止编码。

步骤2.购买有关数据仓库和星型模式设计的书籍。例如,Ralph Kimball的数据仓库工具包。 http://www.amazon.com/Data-Warehouse-Toolkit-Complete-Dimensional/dp/0471200247

步骤3.设计合适的星型模式。问题是一个维度。时间(特别是年份)是一个维度。受访者(如果您了解他们)是一个维度。回应(个人调查工具)是一个维度。事实是特定年份的问题答案。每项调查都会成为多行事实。

步骤4.使用您的不同年份的数据加载星型模式。维度(问题)有点复杂,因为每年都会重复使用一些问题并添加新问题。加载尺寸后,事实行很容易加载。

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

答案 1 :(得分:1)

首先,SQLite不具备更大DBMS的精彩功能。如果您不想为每个问题编写一个select语句片段,则需要一个透明表,而SQLite没有。

原始格式令人困惑 - 我会创建一个包含Person,Question,Answer和Year列的单个表。 (解析人和问题编号。)并从那里开始。如果这不起作用,请在单个表中使用原始格式。从这一点来说,计算最终表是你可以用Python而不是SQL

轻松完成的

答案 2 :(得分:1)

这是一个粗略的sudo代码草图,只使用基本的python东西

拥有所有“条目”的主列表

  • 阅读文件的第一行,获取所有问题
  • 创建一个set()并将所有年份的所有问题添加到集合中
  • 使用'keys'创建一个字典作为问题
  • 另外添加一个人名和年份的密钥
  • 为每个人加载一个新词典并将其附加到您的列表
  • 为每个文件执行此操作,您有一个词典列表
  • 让自己成为一个格式化函数,询问element_in_list.has_key('问题集中的问题')......如果确实如此,那么很好,如果没有,请打印“NONE”或w / e

问题的set()应该被转换为list()以保留最终输出中的顺序

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