2011-09-28 86 views
1

我有一系列包含年度调查/问卷答案的文本文件(每年一个)。文件中的列标题是指问题编号,每行代表一个人对问题的回答,例如将几个表格和一些常见字段合并到一张表中

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

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

+0

感谢你们所有人的答复 - 他们都很有用,并帮助我重新走上正轨。来自pyInTheky和spinning_plate的建议使我开始走向类似于S.Lott所提出的星型模式。最终,我希望这会比我最初的“超级桌面”理念更好的解决方案。再次感谢! – JamesS

回答

2

第1步。停止编码。

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

第3步。设计一个适当的星型模式。问题是一个维度。时间(特别是一年)是一个维度。被投诉人(如果你知道他们)是一个维度。响应(个人调查工具)是一个维度。事实是给定年份问题的答案。每项调查都成为多行事实。

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

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

+2

“停止编码”可能是优秀数据库设计中最容易忽视的一个关键。您可以从IBM红皮书中免费获得一些好的信息。我喜欢[数据建模技术的数据仓库](http://www.redbooks.ibm.com/abstracts/sg242238.html)和[维度建模:在商业智能环境](http://www.redbookss.ibm .COM /文摘/ sg247138.html?打开)。 –

1

首先SQLite不会拥有更大数据库管理系统的奇特功能。如果您不想为每个问题编写select语句片段,那么您需要一个数据透视表,这是SQLite不具备的。

原始格式令人困惑 - 我将创建一个单人表,列人,问题,答案和年份。 (解析出人员和问题编号。)并从那里开始。如果这不起作用,请在单个表格中使用原始格式。由此,计算最终表格是您可以轻松地用Python代替SQL执行的步骤。

1

这里是一个粗略的须藤代码草图只使用基本的Python的东西

对所有“项”

  • 读你的文件的第一行的主列表,让所有的问题
  • 创建一组(),并添加到该集合所有年
  • 所有问题创造一个字典的“钥匙”的问题
  • 额外增加对人的名字一键今年
  • 负荷为每个人一个新的字典,并追加到列表
  • 为每个文件为此,ST您有词典列表
  • 让自己,询问element_in_list.has_key格式化函数(”问题集合中的一个问题')...如果确实如此,那么很好,如果不是,则打印出“无”或带有问题

问题的集合()应该被转换为列表在最终输出中保留订单

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