【问题标题】:Parse nested CSV columns into new CSV rows将嵌套的 CSV 列解析为新的 CSV 行
【发布时间】:2015-03-17 17:49:00
【问题描述】:

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

Table1(原始 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"

Table2(拆分 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

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

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

最重要的方面是在 CSV 列中的项目被拆分到新行时保持它们的顺序。例如,StoreID 1051 的 Category1CSV 内容为“Flour,Yeast,Baking Powder”。这些将映射到 ItemName、ItemRank(序列号)和 ItemCategory 列,这样 ItemName = Flour、ItemRank = 1、ItemCategory = 1。这将是表 2 中的第一行。第二行是 ItemName = Yeast,它的 ItemRank = 2,ItemCategory = 1,依此类推,直到你最终得到类似于上面表 2 的结果。此外,您会注意到 ItemRank 编号从 Category1CSV 列的内容开始,然后是 Category2CSV,最后是 Category3CSV。

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

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

我该怎么做?

【问题讨论】:

  • 这看起来是一个非常混乱的问题,您介意格式化以便阅读吗?同时提供您的代码并指出您遇到的问题。
  • @DanielJimenez,这有点麻烦。我目前没有任何代码。我只有 CSV 文件。你希望我如何重新格式化它?这些表格是我唯一可以在这里格式化的东西。
  • 这很难理解。另外,我认为用户不会欣赏您希望他们只为您编写代码。
  • @DanielJimenez,我对 Python 的经验为零,这就是为什么我没有任何代码可以分享给小组的原因。这不像是我懒惰。我正在阅读 O'Reilly 的几本书来学习。我今天刚刚安装了 Python 3.4 和 PyCharm。我同意,这很难理解......我会尽量让它更容易。我只需要将 Table1 中的格式设置为 Table2 中的格式即可。
  • 我不希望任何人花费数小时为我创建代码。如果有人至少可以帮助我入门,我将不胜感激。我尝试使用 Excel 宏和 SQL 来解决这个问题,但似乎 Python 的优势之一是解析和使用 CSV、XML 等。我昨晚才知道,所以我很高兴看到Python可以做到。如果有人至少可以让我开始,将不胜感激。

标签: python csv python-3.x


【解决方案1】:

为您指明正确的方向:

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

正如 Daniel 所指出的那样,恐怕我并不完全清楚您在问题的解释性段落中的担忧是什么,但我相信如果您花一些时间玩这个模块,您会发现你可以让它像你希望的那样工作。

【讨论】:

  • 我正在查看 csv 模块。太棒了!我的主要担心是维护这些 CSV 列中项目的顺序,因为它们被拆分为行,并添加与该顺序相对应的序列号。例如,StroreID 1051 的 Category1CSV 内容为“面粉、酵母、发酵粉”。这些将映射到 ItemName、ItemRank(序列号)和 ItemCategory 列,这样 ItemName = Flour、ItemRank = 1、ItemCategory = 1。这将是表 2 中的第一行。第二行是 ItemName = Yeast,ItemRank = 2,ItemCategory = 1,以此类推
  • 好的;好消息,因为您无需担心。我建议您尝试并最终得到一个字典列表, csv.DictReader 会很好地帮助您。列表是有序的,您的数据在列表中的顺序与在文档中的顺序相同。
  • 我认为这开始有意义了。我需要一个列表,因为字典对象不是有序的,而列表对象是有序的,但字典键对有助于解决它们来自哪一列的问题。
猜你喜欢
  • 2021-08-31
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 2016-07-02
  • 2022-01-17
  • 2013-12-23
  • 1970-01-01
  • 2010-11-08
相关资源
最近更新 更多