【问题标题】:How to ignore a CSV delimiter within a quoted field?如何忽略引用字段中的 CSV 分隔符?
【发布时间】:2018-07-28 00:52:00
【问题描述】:

我有一个格式如下的 CSV 数据转储:

"field1";"{"JSON-KEY": "JSON-VALUE"}";"field3"

如果我像这样使用 CSV Python 阅读器...

csv.reader(csvfile, delimiter=';', quotechar='"')

我有两个问题:

(1) 当 JSON-VALUE 字符串包含 delimiter 字符 ';' Reader 将其视为分隔符并将 VALUE 分成两个字段。

(2) 当 (1) 没有问题时,JSON-VALUE 字段被误解为开头少一个引号,结尾多一个引号。例如:

 ['field1','{JSON-KEY": "JSON-VALUE"}"','field3']

这两个问题可能是相关的,但我无法通过使用 Python 文档和此处的其他问题来解决这个问题。有没有人知道我在这里缺少什么以及如何配置阅读器来处理这个问题?

【问题讨论】:

  • 这里的CSV格式好像有歧义。您的某些报价是 CSV 报价,其他报价是实际数据的一部分,并未转义。除非有一些你没有解释的非显而易见的规则,否则解析它的唯一方法是猜测。是否可以首先修复数据转储以生成有效的 CSV 文件?
  • 如果没有,您可能会想出一些可行的猜测。例如,如果您首先扫描每一行以查找出现在引号内的分号并使用转义字符对其进行转义,然后创建一个不使用 " 作为引号字符并使用该转义字符的 CSV 阅读器,该组合两个步骤将能够解析此示例,并且它可能适用于您的整个转储。 (或者它可能不会;如果没有看到它,或者没有测试它,很难说。)

标签: python python-3.x csv


【解决方案1】:

其实csv数据是无效的。引号应该像这样转义:

"field1";"{""JSON-KEY"": ""JSON-VALUE""}";"field3"

如果您无法控制 csv 数据的生成,您可以尝试使用 quotechar='',然后修剪字段中的引号。

但是,如果 json 数据中有;,那就有问题了。

那么另一种选择是手动读取第一个和最后一个字段,并将它们之间的数据视为 json 数据。

【讨论】:

  • 确实,我可以更改 CSV 并通过转义引号,一切正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多