Functions

將互動矩陣轉換為三元關係

  • February 7, 2015

我在 MS Excel 中有我所謂的稀疏“互動矩陣”數據,我希望將其轉換為 Access 中的“三元關係”(表)。

電子表格數據採用以下模式:

Name   Act-1  Act-2  Act-3  ... Act-n
name-1         week
name-2                week
name-3  week                     week
 :                         week
name-m         week   week

n活動作為 Excel 標題,m每個數據行的第一列中的名稱,以及在任何人(姓名)進行活動時輸入的零個或多個特定*週。*如果n它們很小且固定,我可以將關係保留為矩陣,但n可以變得非常大並且矩陣將非常稀疏。

因此所需的關係表結構(我稱之為分配)是這樣的:

Assignment: Name, Activity, Week

Excel 或 Access 中是否有一個簡單的工具來促進這種數據轉換?

虛擬碼算法將是

for each Name (row)
   for each Activity (column)
       if Week, add Assignment: Name, Activity, Week

雖然我在 VBA 中編碼(幾年前),但我從未將它與 Excel 結合使用。我傾向於使用 Python 和 CSV 文件。也許有一種很好的 SQL 技術(即使不是訪問特定的)?還是與“旋轉”有關(我從來不明白那是什麼意思)?

對於這種轉換,您有什麼想分享的經驗嗎?

我的解決方案是將電子表格保存為製表符分隔的“矩陣”文件,執行以下“資料結構轉換”程序,然後將生成的製表符分隔的“關係”文件導入 Access。

Python 3.4 程式碼:

import csv
source_path = 'matrix.txt'
target_path = 'relation.txt'
source_deli = '\t'
target_deli = '\t'
target_head = ("Name", "Activity", "Week")
fin = open (source_path, 'r', newline='')
fout = open (target_path, 'w', newline='')
reader = csv.DictReader (fin, delimiter=source_deli)
writer = csv.writer (fout, delimiter=target_deli)
writer.writerow (target_head)
for row in reader:
   for key in row:
       if key != "Name" and row[key]:
           target_row = (row["Name"], key, row[key])
           writer.writerow (target_row)
fin.close()
fout.close()

引用自:https://dba.stackexchange.com/questions/91220