2011-09-28 91 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"} 
]