Plone 使用transmogrifier将数据附加到AT字段

Plone 使用transmogrifier将数据附加到AT字段,plone,transmogrifier,Plone,Transmogrifier,我有一个CSV数据文件,如下所示: 1, [a, b, c] 2, [a, b, d] 3, [a] ID, LinesField a, [1,2,3] b, [1,2] c, [1] d, [2] def transpose(cvs): keys = [] [keys.extend(v) for v in cvs.values()] keys = set(keys) d = {} for key in keys: values =

我有一个CSV数据文件,如下所示:

1, [a, b, c]
2, [a, b, d]
3, [a]
ID, LinesField
a, [1,2,3]
b, [1,2]
c, [1]
d, [2]
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
以及一些Plone对象,这些对象应按如下方式更新:

1, [a, b, c]
2, [a, b, d]
3, [a]
ID, LinesField
a, [1,2,3]
b, [1,2]
c, [1]
d, [2]
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
因此,为了澄清,id为
a
的对象在CSV的第1、2和3行命名,因此对象
a
LinesField
属性需要列出这些行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]

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

1, [a, b, c]
2, [a, b, d]
3, [a]
ID, LinesField
a, [1,2,3]
b, [1,2]
c, [1]
d, [2]
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']}将包含所有可能的值集(['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部分。

我添加了一段,用不同的措辞表达了我对您问题的理解。我确实想知道
[a,b,c]
部分,那是CSV第二个位置的文本字符串吗?您可以提供一些CSV行示例吗?非常感谢。是的,你的措辞澄清了我的意思——为没有完全清楚而道歉。CSV来自Excel电子表格,其中列1是一个字符串,而列2实际上是一个由半冒号分隔的字符串(如果输入数据的人很小心)。非常感谢,这对我帮助很大。如果它有助于您充分考虑所回答的问题,请将其标记为: