1

Products次の4つのフィールドのリストを含むcsvファイルがあります

Product ID, Name, Alias, UOM

2 つのテーブルを持つデータベースにファイルをインポートしたいと考えています。最初はProductテーブルです:

Product ID, Name, UOM

2番目はProduct Aliasテーブルです:

Product ID, Alias

それぞれProduct IDに 0 個から多数のエイリアス名が含まれる場合があります。

Alias「;」のように、コンマ間に異なる区切り文字があるという事実によって、列を別の方法で処理する方法はありますか? またはピリオド「.」特定の製品 ID の 0 から多数のエイリアス名を分離するには?

したがって、csv インポート中に 3 番目のコンマを取得すると、そのデータが 2 番目のテーブルにインポートされますが、そのコンマ フィールドにあるエイリアス名の数だけ製品 ID が繰り返される新しいレコードがインポートされます。

うまく説明できれば幸いです。使用しているコードに関係なく、これを行う可能性のある処理にもっと興味がありますが、python が優先されるルートです。

サンプルデータ

ProductID, Name,    Alias, UOM
122,       Widget1, W1;    Wid1;Wt1, Each
123,       Widget2, ,      Each
124,       Widget3, W3;    Wt3, Each
4

1 に答える 1

2

これはとても簡単です。

まず、csv通常どおり を使用してすべての列を取得します。これらの列の 1 つは、それ自体がセミコロンで区切られた値のリストになります。

引用などを気にする必要がない場合は、そのまま使用できますsplit。例えば:

with open('foo.csv') as f:
    for row in csv.DictReader(f):
        cursor.execute('''INSERT INTO Product (ProductID, Name, UOM) 
                          VALUES (:ProductID, :Name, :UOM)''', row)
        for alias in row['Alias'].split(';'):
            cursor.execute('''INSERT INTO ProductAlias (Name, Alias) 
                              VALUES (?, ?)''', row['Name'], alias)

エイリアス内にスペースを含めることができる場合は、2 種類の区切り文字に加えて、2 種類の引用またはエスケープが必要になります。このような:

123,"Widget 1","Widget1;W1;Wid1;Wt1;'W 1'",Each

そして、別の を使用して解析したいと思うでしょうcsv.reader。もちろんcsv、単一の行を単一の行にではなく、一連の行を一連の行に解析することを目的としていますが、単一の行をリストでラップし、結果から単一の行を抽出するだけで簡単に処理できます。たとえば、これの代わりに:

row['Alias'].split(';')

… これを行う:

next(csv.reader([row['Alias']], delimiter=";", quotechar="'"))

(ただし、これほど複雑になったら、式を複数のステップに分割することをお勧めします。)

于 2013-08-22T22:40:36.257 に答える