清理不可解析的CSV文件的简单方法是什么
这个csv文件创建得没问题,但里面的名字和地址字段充满了各种标点符号。所以当你试图把它导入到mysql时,就会出现解析错误。比如,名字字段可能看起来像这样:“john ""," doe”。我对收到的数据没有控制权,所以没办法阻止别人输入这些乱七八糟的数据。从上面的例子可以看出,如果把外面的引号当作是包围引号,那它是对的,但mysql、excel、libreoffice等软件却会把它当成一个全新的字段。有没有办法解决这个问题?我发现有些字段甚至在最后的包围引号前面还有一个反斜杠。我现在很困惑,因为我有1700万条记录需要导入。
我有Windows和Linux系统,所以你想到的任何解决方案都请告诉我。
6 个回答
你的标题问的是:有什么简单的方法可以清理一个无法解析的csv文件
如果这个文件无法解析,说明你无法正确地把它分成不同的字段。所以你就没法清理它。
你第一句话说:这个csv文件是正确创建的,但名字和地址字段里包含了所有可能的标点符号。
如果这个csv文件是正确创建的,那你就可以把它正确地分成字段。所以你可以清理它。
只有标点符号?你真幸运。在数据库中,未经验证的文本字段通常会包含一些麻烦的字符,比如制表符、回车、换行,甚至是Ctrl-Z。
谁说它是“无法解析”的?根据什么判断?他们对“可解析”的定义是什么?
谁说它是“正确创建”的?根据什么判断?他们对“正确”的定义是什么?
你能不能给我们看看大约5行相关的内容,看看是什么让你困扰?编辑你的问题,把例子格式化成代码,这样更容易阅读。清楚地标明每个字段的开始和结束,比如:
...,"john ""," doe",...
顺便说一下,上面的内容在任何解释下都不是“正确”的;因为引号字符的数量是奇数,而且没有一个是转义的,所以它不可能是对的。
我对“正确”的定义是:这里有一种方法可以生成一个无论数据库里有什么内容都能被解析的CSV字段 [注意:Python的csv模块对`\x00`会报错]:
if '"' in field:
output = '"' + field.replace('"', '""') + '"'
elif any of comma, line feed, carriage return in field: # pseudocode
output = '"' + field + '"'
else:
output = field
你没有说明你是否能控制CSV文件的创建。我假设你是可以的,因为如果不能的话,CSV文件就坏了,没办法恢复,除非有人手动修复,或者用一些很聪明的算法来“猜测”正确的分隔符和用户输入的分隔符。
把用户输入的制表符(假设有的话)转换成空格,然后用制表符作为分隔符导出数据。
如果以上方法不可行,你需要实现一个转义序列,以确保用户输入的数据不会被当作分隔符。
这可能不是一个实用的答案,但有人需要说清楚。你不应该这样做。CSV是一种文件格式,里面的数据编码是有标准的。如果有人给你提供了一个CSV文件,那么这个文件应该是正确分隔和转义的,否则就是个损坏的文件,你应该拒绝接受。让提供者重新从他们的数据源中正确导出文件。
比如说,如果你让别人给你发一个JPG图片,他们却发来了一个每5个字节就缺失一个字节或者插入了垃圾字节的文件,你肯定不会接受,还会说“哦,我来帮你修复一下”。