1

我有一个 csv 文件,其中包含Products以下 4 个字段的列表

Product ID, Name, Alias, UOM

我想将文件导入到有 2 个表的数据库中。首先是Product表格:

Product ID, Name, UOM

第二个是Product Alias表:

Product ID, Alias

每个Product ID可能有 0 到多个别名。

有没有什么办法可以Alias通过逗号之间的不同分隔符来处理该列,例如“;” 或句号“。” 将给定产品 ID 的 0 到多个别名分开?

因此,在 csv 导入期间,当它获得第三个逗号时,它会将该数据导入第二个表,但会导入一条新记录,其中包含重复的产品 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照常使用来获取所有列。其中一列本身就是一个以分号分隔的值列表。

如果您不需要担心引用等,您可以使用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)

如果您可以在别名中包含空格,那么您将需要两种引用或转义,以及两种分隔符。像这样:

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 回答