【问题标题】:Convert a csv to a multidimension array将 csv 转换为多维数组
【发布时间】:2014-03-27 09:34:39
【问题描述】:

我有一个包含如下数据的 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)。因为我不关心语言,所以我从更广泛的意义上来打开这个问题。

【问题讨论】:

  • 您是否缺少“Sales[10,21,11] = 10908”中的字段?假设您要提供每个字段并且只获取 Sales 值,您将拥有一个多维稀疏数组或某种类型的 Map。这是你需要的吗?
  • @Aioros 是的,我更正了这个问题。是的,多维稀疏数组听起来很像我,虽然这对我来说是新的,所以我只能在看到它工作后才能确认。

标签: python arrays r matlab csv


【解决方案1】:

如果我理解正确,这就是您所要求的 - python 版本。这不是最好的编码,但基本思想是 add 函数递归地填充字典字典

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 中的名称。对此感到抱歉。

【讨论】:

    猜你喜欢
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2019-06-29
    • 2012-08-15
    相关资源
    最近更新 更多