2014-03-27 216 views
0

我有包含數據的CSV如下:轉換一個csv到多維陣列

"Store","Dept","Year","Week","Sales" 
10,21,2,11,10908 
11,30,2,12,12279 
11,33,2,13,11061 
12,81,2,14,12288 
32,70,2,15,9950 

並希望獲得多維陣列,這樣我可以方便地調用:

Sales[store, dept, year, week] 

例如,Sales[10,21,2,11] = 10908

任何語言都可以。最好是Python,Matlab或R.

不知何故,我找不到解決方案。我一直在努力使它在R的工作,迄今沒有成功(refer)。由於我不關心這門語言,所以我從更廣泛的意義上提出了這個問題。

+0

您是否缺少「Sales [10,21,11] = 10908」中的字段?假設您將提供每個字段並僅獲取Sales值,則您將擁有一個多維稀疏數組或某種類型的Map。那是你需要的嗎? – Aioros

+0

@Aioros是的,我糾正了這個問題。是的,多維稀疏陣列聽起來就像我所說的,雖然這對我來說是新的,所以只有當我看到它工作時才能確認。 – tucson

回答

1

如果我理解你是對的,這就是你要求的 - python版本。這不是最大的編碼,但基本的想法是,添加函數遞歸地填充詞典的字典

import csv 


def add(h, *args): 
    """ 
    >>> add({},1,2,4,8) 
    {1: {2: {4: 8}}} 
    """ 
    if len(args) == 2: 
     h[args[0]] = args[1] 
     return h 
    if not(args[0] in h.keys()): 
     h[args[0]] = {} 
    add(h[args[0]], *args[1:]) 
    return h 


if __name__ == "__main__": 
    hoh = {} 
    with open('data.csv', 'rb') as csvfile: 
     spamreader = csv.reader(csvfile, delimiter=',', quotechar='|') 
     headers = spamreader.next() 
     for row in spamreader: 
      print ', '.join(row) 
      add(hoh, *row) 
    import pprint 
    pprint.pprint(hoh) 

ps。我用h和hoh作爲變量名的原因是我認爲它們是「哈希」,這就是這種類型的關聯數組在perl和awk中的含義。對於那個很抱歉。