什么是清理无法解析的 csv 文件的简单方法

Posted

技术标签:

【中文标题】什么是清理无法解析的 csv 文件的简单方法【英文标题】:What is an easy way to clean an unparsable csv file 【发布时间】:2011-09-04 13:17:15 【问题描述】:

csv 文件已正确创建,但名称和地址字段包含所有可用的标点符号。因此,当您尝试导入 mysql 时,您会遇到解析错误。例如,名称字段可能看起来像这样,“john”“doe”。我无法控制我收到的数据,所以我无法阻止人们输入垃圾数据。从上面的示例中您可以看到,如果您认为外部引号是封闭引号,那么它是正确的,但是 mysql、excel、libreoffice 等当然会看到一个全新的字段。有没有办法解决这个问题?我发现有些字段之前甚至有一个反斜杠最后附上引号。我不知所措,因为我有 1700 万条记录要导入。

我有windows os和linux,所以如果你能想到任何解决方案,请告诉我。

【问题讨论】:

您可以使用其他分隔符重新导出数据吗? 我将拒绝该文件并让供应商以制表符分隔重新发送。 来自 Python 之禅 (import this)。 “面对模棱两可,拒绝猜测的诱惑。” 【参考方案1】:

这可能不是一个有用的答案,但有人需要说出来。 您不应该这样做。 CSV 是一种具有预期数据编码的文件格式。如果有人向您提供 CSV 文件,那么它应该被正确分隔和转义,否则它是一个损坏的文件,您应该拒绝它。让供应商从导出文件的任何数据存储中正确地重新导出文件。

如果您要求某人向您发送 JPG,而他们发送的是正确的 JPG 文件,其中每 5 个字节被省略或插入垃圾字节,您不会接受并说“哦,我会为您重建它”。

【讨论】:

好主意,但我生活在现实世界中,这并不总是可能的【参考方案2】:

您没有说您是否可以控制 CSV 文件的创建。我假设您这样做了,就好像没有,CVS 文件已损坏并且在没有人工干预的情况下无法恢复,或者一些非常聪明的算法可以“猜测”正确的分隔符与用户输入的分隔符。

将用户输入的制表符(假设有一些)转换为空格,然后使用制表符分隔符导出数据。

如果上述不可行,您需要实现一个 ESC 序列以确保用户输入的数据不被视为分隔符。

【讨论】:

【参考方案3】:

你的标题问:什么是清理无法解析的 csv 文件的简单方法

如果它无法解析,则意味着您无法正确地将其分解为字段。所以你不能清理它。

您的第一句话指出:csv 文件已正确创建,但名称和地址字段包含所有可用的标点符号。

如果 csv 文件创建正确,那么您可以正确地将其拆分为字段。所以你可以清理它。

只有标点符号?你很幸运。数据库中未经验证的文本字段通常包含诸如 tab、回车、换行甚至 Ctrl-Z 之类的脏东西。

谁说它“不可解析”?有什么依据?他们对“可解析”的定义是什么?

谁说它是“正确创建的”?有什么依据?他们对“正确”的定义是什么?

您能否向我们展示一下导致您悲伤的 5 行左右的相关部分?编辑您的问题并将示例格式化为代码,以使其更易于阅读。明确上一个/下一个字段的停止/开始位置,例如

...,"john ""," doe",...

顺便说一句,在任何解释下,上述内容都不“正确”;它不可能是正确的,奇数个引号字符都没有被转义。

我对正确的定义:这里是如何发出一个可以解析的 CSV 字段,无论数据库中有什么[警告:Python csv module barfs on `\x00']:

if '"' in field:
    output = '"' + field.replace('"', '""') + '"'
elif any of comma, line feed, carriage return in field: # pseudocode
    output = '"' + field + '"'
else:
    output = field

【讨论】:

【参考方案4】:

这是一个非常棘手的问题。我不知道有什么真正的方法来解决它,但也许你可以尝试拆分",",清理结果数组中的项目(独角兽:)),然后重新加入行?

【讨论】:

【参考方案5】:

MySQL 导入有许多参数,包括转义字符。举个例子,我认为引号是通过在前面加上引号来转义的。因此,使用 esaped by '"' 的导入将起作用。

【讨论】:

【参考方案6】:

首先——找出各种错误。然后用空字符串替换它们。去做就对了!如果您需要这些损坏的数据 - 只有您可以恢复它。

【讨论】:

以上是关于什么是清理无法解析的 csv 文件的简单方法的主要内容,如果未能解决你的问题,请参考以下文章

Python数据清理之解析CSV文件

无法使用 Google App Script 将解压缩的 csv 上传到具有更大数据的 BigQuery

我无法将 csv 文件中的日期信息解析为 ipython

无法解析 R 符号和方法

Android Studio:从 G​​ithub 导入项目并使用 gradle 文件重建/清理/同步后“无法解析符号 R”

Python:我无法从函数中的标准输入解析 csv