2014-03-27 64 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中的含义。对于那个很抱歉。