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 行目に名前が付けられているため、LinesFieldオブジェクトのプロパティにaはこれらの行 ID (行の最初の番号) がリストされている必要があります。

理想的には、Transmogrifier を使用してこの情報をインポートしたいと思います (事前に Excel で操作を行うことは避けます)。理論的には 2 つの方法がありますが、実際にこれを行う方法はわかりません。例へのいくつかのポインタに感謝します。アイテムが Plone オブジェクトの構造を反映するようにパイプライン全体を変換してから、ATSchemaUpdater ブループリントを使用する必要があると思いますが、パイプラインにアイテムを追加する方法の例が見当たりません (必要ですか?独自の設計図を作成しますか?) または、代わりに、アイテムが存在するときにループして、左側の列の値を右側のリストのアイテムに追加することもできます。そのためには、値を上書きするのではなく、ATSchemaUpdater で値を追加する方法が必要です。繰り返しますが、そのための青写真はどこにありますか?

サンプルの csv 行を次に示します。

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

Plone オブジェクトはテーマになり、行フィールドは名前のリストになります:

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 に答える