首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用transmogrifier将数据追加到AT字段

使用transmogrifier将数据追加到AT字段
EN

Stack Overflow用户
提问于 2011-08-30 22:59:17
回答 1查看 614关注 0票数 2

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

代码语言:javascript
复制
1, [a, b, c]
2, [a, b, d]
3, [a]

以及一些Plone对象,它们应该像这样更新:

代码语言:javascript
复制
ID, LinesField
a, [1,2,3]
b, [1,2]
c, [1]
d, [2]

因此,为了清楚起见,id为a的对象是在CSV的第1、2和3行命名的,因此对象aLinesField属性需要列出这些行id(该行上的第一个数字)。

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

下面是一些示例csv代码行:

代码语言:javascript
复制
"Name","Themes"
"Bessie Brown","cah;cab;cac"
"Fred Blogs","cah;cac"
"Dinah Washington","cah;cab"

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

代码语言:javascript
复制
cah, ['Bessie Brown', 'Fred Boggs' etc etc]
EN

回答 1

Stack Overflow用户

发布于 2011-08-31 04:04:04

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

代码语言:javascript
复制
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'};keys将包含所有可能的值集合(‘a’,'c','b','d');d将是您想要的{'a':1,2,3,'c':1,'b':1,2,'d':2}。

也许有更好的方法,但我不是Python魔术师。

插入部分可能如下所示:

代码语言:javascript
复制
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部分。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7245251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档