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

Python 将嵌套的CSV列解析为新的CSV行,python,csv,python-3.x,Python,Csv,Python 3.x,我有一个CSV文件,其中包含3列“嵌套”的CSV数据。我想将这些CSV列的内容拆分出来,为每个CSV项目创建一个新行,为每个项目添加一个序列号(对应于CSV列中项目的顺序),然后添加一个对应于其来源的CSV列的相应ItemID号。我需要把下面的表1做成表2 表1(原始CSV文件)。第一行是列名: StoreID、日期、店名、城市、州、类别1csv、类别2csv、类别3csv 1051,2/16/2014,俄亥俄州哥伦布伊斯顿,“面粉、酵母、发酵粉”、“牛奶、水、油”、“肉桂、糖” 1425年,2

我有一个CSV文件,其中包含3列“嵌套”的CSV数据。我想将这些CSV列的内容拆分出来,为每个CSV项目创建一个新行,为每个项目添加一个序列号(对应于CSV列中项目的顺序),然后添加一个对应于其来源的CSV列的相应ItemID号。我需要把下面的表1做成表2

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

StoreID、日期、店名、城市、州、类别1csv、类别2csv、类别3csv
1051,2/16/2014,俄亥俄州哥伦布伊斯顿,“面粉、酵母、发酵粉”、“牛奶、水、油”、“肉桂、糖”
1425年,2014年1月14日,俄亥俄州西湖克罗克公园,“发酵粉,酵母,四”,“油,牛奶,水”

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

StoreID、日期、StoreName、城市、州、ItemName、ItemRank、ItemCategory
1051,2/16/2014,俄亥俄州哥伦布伊斯顿,面粉,1,1
1051,2/16/2014,俄亥俄州哥伦布伊斯顿,酵母,2,1
1051,2/16/2014,俄亥俄州哥伦布伊斯顿,发酵粉,3,1
1051,2/16/2014,俄亥俄州哥伦布伊斯顿,米尔克,4,2
1051,2/16/2014,伊斯顿,哥伦布,俄亥俄州,沃特,5,2
1051,2/16/2014,俄亥俄州哥伦布伊斯顿,石油,6,2
1051,2/16/2014,俄亥俄州哥伦布伊斯顿,肉桂,7,3
1051,2/16/2014,俄亥俄州哥伦布伊斯顿,苏格,8,3
1425,1/14/2014,俄亥俄州西湖克罗克公园,发酵粉,1,1
1425,1/14/2014,俄亥俄州西湖克罗克公园,酵母,2,1
1425,1/14/2014,俄亥俄州西湖克罗克公园,面粉,3,1
1425年1月14日,俄亥俄州西湖克罗克公园,石油,4,2
1425,1/14/2014,俄亥俄州西湖克罗克公园,米尔克,5,2
1425年,2014年1月14日,俄亥俄州西湖克罗克公园,沃特,6,2

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

  • ItemName是项目(例如:面粉)
  • ItemRank是CSV列表中项目的顺序,并且
  • ItemCategory为1、2或3,具体取决于数据是来自Category1CV、Category2CV还是Category3CSV
最重要的一点是,当项目被拆分到新行时,保持CSV列中项目的顺序。例如,StoreID 1051的分类内容为“面粉、酵母、发酵粉”。这些将映射到ItemName、ItemRank(序列号)和itemcegory列,以便ItemName=four、it's ItemRank=1和itemcegory=1。这将是表2中的第一行。第二行是ItemName=Yeast,它的ItemRank=2,itemcegory=1,依此类推,直到您得到上面的表2。此外,您会注意到ItemRank编号从列Category1CV的内容开始,然后继续到Category2CV,最后是Category3CSV

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

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


我如何才能做到这一点?

为您指出正确的方向:

  • 您正在寻找的模块是Python的有用模块。看一看文档——这里有一些很好的示例,引导您解析输入文件(任何大小和结构)并转换为各种Python对象
  • 幸运的是,你的“空行”不是问题。csv模块会将两个逗号(或您选择的任何其他分隔符)识别为空字符串,并按照您的预期进行操作

正如Daniel所指出的,我恐怕不完全清楚您在问题的解释性段落中担心什么,但我相信,如果您花一些时间玩一下模块,您会发现您可以让它按照您的期望工作

这看起来是一个非常混乱的问题,你介意格式化以便更容易阅读吗?同时提供您的代码并指出您的问题所在。@DanielJimenez,这是一个有点混乱的问题。我现在没有任何代码。我只有CSV文件。您希望我如何重新格式化它?表格是我在这里唯一可以格式化的东西,只是很难理解。此外,我认为当你希望用户只编写代码时,他们不会欣赏你。@DanielJimenez,我对Python没有任何经验,这就是为什么我没有任何代码可以分享给团队的原因。我又不是在偷懒。我正在读几本奥莱利的书来学习。我今天刚刚安装了Python3.4和PyCharm。我同意,这很难理解。。。我会尽量让它更容易。我只需要将表1中的格式设置为表2中的格式。我不希望任何人花费数小时为我创建代码。如果有人能帮我开始,我会很感激的。我尝试用Excel宏和SQL来解决这个问题,但Python的优势之一似乎是解析和使用CSV、XML等。我昨天晚上才了解到这一点,所以我很高兴看到Python能做什么。如果有人能让我开始,我将不胜感激。我正在看csv模块。太棒了!我主要担心的是在这些CSV列被拆分成行时保持它们的顺序,并添加一个与该顺序对应的序列号。例如,StroreID 1051的类别为“面粉、酵母、发酵粉”。这些将映射到ItemName、ItemRank(序列号)和itemcegory列,以便ItemName=four、it's ItemRank=1和itemcegory=1。这将是表2中的第一行。第二行是ItemName=Yeast,它的ItemRank=2,itemcegory=1,依此类推;好消息,因为你没什么好担心的。我建议你