将嵌套的CSV列解析为新的CSV行

时间:2015-03-17 17:49:01

标签: python csv python-3.x

我有一个CSV文件,其中包含3列CSV数据"嵌套"在其中。我想将这些CSV列的内容拆分为每个CSV项目创建一个新行,为每个项目添加一个序列号(对应于CSV列中序列中项目的顺序),然​​后添加一个对应的ItemID编号,对应于它来自的CSV列。我需要看看下面的Table1,看起来像Table2。

表1(原始CSV文件)。第一行是列名:

StoreID,Date,StoreName,City,State,Category1CSV,Category2CSV,Category3CSV
1051,2/16/2014,Easton,Columbus,OH,"Flour,Yeast,Baking Powder","Milk,Water,Oil","Cinnamon,Sugar"
1425,1/14/2014,Crocker Park,Westlake,OH,"Baking Powder,Yeast,Four","Oil,Milk,Water"

Table1 original CSV file

表2(拆分CSV列内容后)。第一行是列名:

StoreID,Date,StoreName,City,State,ItemName,ItemRank,ItemCategory
1051,2/16/2014,Easton,Columbus,OH,Flour,1,1
1051,2/16/2014,Easton,Columbus,OH,Yeast,2,1
1051,2/16/2014,Easton,Columbus,OH,Baking Powder,3,1
1051,2/16/2014,Easton,Columbus,OH,Milk,4,2
1051,2/16/2014,Easton,Columbus,OH,Water,5,2
1051,2/16/2014,Easton,Columbus,OH,Oil,6,2
1051,2/16/2014,Easton,Columbus,OH,Cinnamon,7,3
1051,2/16/2014,Easton,Columbus,OH,Sugar,8,3
1425,1/14/2014,Crocker Park,Westlake,OH,Baking Powder,1,1
1425,1/14/2014,Crocker Park,Westlake,OH,Yeast,2,1
1425,1/14/2014,Crocker Park,Westlake,OH,Flour,3,1
1425,1/14/2014,Crocker Park,Westlake,OH,Oil,4,2
1425,1/14/2014,Crocker Park,Westlake,OH,Milk,5,2
1425,1/14/2014,Crocker Park,Westlake,OH,Water,6,2

Table2 after parsing the CSV columns

标记为Category1CSV,Category2CSV和Category3CSV内容的表1列映射到表2列:ItemName,ItemRank,ItemCategory,其中:

  • ItemName是Item(例如:Flour),
  • ItemRank是CSV列表中项目的顺序,
  • ItemCategory为1,2或3,具体取决于数据来自Category1CSV,Category2CSV还是Category3CSV。

最重要的方面是在CSV列中拆分新行时维护项目的顺序。例如,StoreID 1051具有"面粉,酵母,发酵粉"的Category1CSV含量。这些将映射到ItemName,ItemRank(序列号)和ItemCategory列,使得ItemName = Flour,它的ItemRank = 1,以及ItemCategory = 1.这将是表2中的第一行。 row将是ItemName = Yeast,它的ItemRank = 2,而ItemCategory = 1,依此类推,直到你最终看到上面的表2。此外,您会注意到ItemRank编号从Category1CSV列的内容开始,然后继续到Category2CSV,最后是Category3CSV。

并非原始CSV文件中的所有行都包含所有3个CSV列中的项目。例如,商店1051在所有3个类别中都有商品,但商店1425仅包含类别1和2中的商品。其他商店可能只有1个类别中的商品。在处理文件时,有些逻辑需要考虑到这一点。

我的CSV文件包含几千行。生成的文件可能有数万行。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

指出正确的方向:

  • 您正在寻找的模块是Python的有用csv模块。看看它的文档 - 有一些很好的例子可以帮助您解析输入文件(任何大小和结构)并转换为各种Python对象。
  • 很高兴,你的空行'事情是没有问题的。 csv模块将识别两个逗号(或您选择的任何其他分隔符)作为空字符串,并按照您的预期行事。

正如丹尼尔所指出的那样,我担心你在问题的解释性段落中对你的担忧并不完全清楚,但我有信心,如果你花一些时间玩游戏使用该模块,您会发现您可以按照您的希望使其工作。