2

我有一个这样的 CSV 数据文件:

1, [a, b, c]
2, [a, b, d]
3, [a]

和一些应该像这样更新的 Plone 对象:

ID, LinesField
a, [1,2,3]
b, [1,2]
c, [1]
d, [2]

因此,为了澄清,具有 id 的对象a在 CSV 的第 1、2 和 3 行命名,因此LinesFieldobject 的属性a需要列出这些行 id(行上的第一个数字)。

理想情况下,我想使用 Transmogrifier 导入此信息(并避免事先在 Excel 中进行任何操作),并且我可以看到两种方法,理论上可以做到这一点,但我无法弄清楚如何在实践中做到这一点。我将不胜感激一些示例。我认为要么我需要转换整个管道,以便项目反映我的 Plone 对象的结构,然后使用 ATSchemaUpdater 蓝图,但我看不到任何关于如何将项目添加到管道的示例(我需要写我自己的蓝图?)或者,或者,我可以遍历存在的项目并将左列中的值附加到右侧列表中的项目。为此,我需要一种使用 ATSchemaUpdater 附加值而不是覆盖它们的方法 - 再次,是否有任何地方的蓝图?

这是一些示例 csv 行:

"Name","Themes"
"Bessie Brown","cah;cab;cac"
"Fred Blogs","cah;cac"
"Dinah Washington","cah;cab"

Plone 对象将是一个主题,而 lines 字段是一个名称列表:

cah, ['Bessie Brown', 'Fred Boggs' etc etc]
4

1 回答 1

2

我不太确定您是否要使用 transmogrifier 读取 CVS 文件,但我认为您可以使用如下函数创建一个部分以将这些值插入到管道中的项目中:

def transpose(cvs):
    keys = []
    [keys.extend(v) for v in cvs.values()]
    keys = set(keys)

    d = {}
    for key in keys:
        values = [k for k, v in cvs.iteritems() if key in v]
        d[key] = values

    return d

在这种情况下,cvs是 {1: ['a', 'b', 'c'], 2: ['a', 'b', 'd'], 3: ['a']}; 将包含所有可能的值 set(['a', 'c', 'b', 'd']); 并且d将是您想要的 {'a': [1, 2, 3], 'c': [1], 'b': [1, 2], 'd': [2]}。

可能有更好的方法可以做到这一点,但我不是 Python 魔术师。

插入部分可能如下所示:

class Insert(object):
    """Insert new keys into items.
    """
    classProvides(ISectionBlueprint)
    implements(ISection)

    def __init__(self, transmogrifier, name, options, previous):
        self.previous = previous
        self.new_keys = transpose(cvs)

    def __iter__(self):
        for item in self.previous:
            item.update(self.new_keys)
            yield item

之后,您可以使用 SchemaUpdater 部分。

于 2011-08-30T20:04:03.930 回答