如何从巨大的 csv 文件中清除不良数据

Posted

技术标签:

【中文标题】如何从巨大的 csv 文件中清除不良数据【英文标题】:How to clean bad data from huge csv file 【发布时间】:2020-02-21 08:55:21 【问题描述】:

所以我有一个巨大的 csv 文件(假设 5 GB),我想将数据插入到表中,但它返回错误,即数据的长度不一样

我发现某些数据的列比我想要的多 例如,我拥有的正确数据有 8 列,但有些数据有 9 列(可能是人为/系统错误)

我只想取8列数据,但是由于数据太大,我无法手动或在python中使用解析

有什么方法可以推荐吗?

我使用的是 linux,所以也欢迎任何 linux 命令

在 sql 中我使用的是 COPY ... FROM ... CSV HEADER;将csv导入表的命令

【问题讨论】:

您应该能够通过您正在使用的数据库的加载操作来处理这个问题。但是你甚至没有指定数据库,所以你最终会复制文件。 很抱歉忘记放我的数据库信息,我用的是postgresql 【参考方案1】:

您可以为此目的使用awk。假设您的字段分隔符是逗号 (,),此代码可以完成工作:

awk -F\, 'NF==8 print' input_file >output_file

【讨论】:

CSV 不是行结构的。 CSV 行可能覆盖超过 1 行。并且有可能,一个字段包含一个逗号。对于这两种情况,上面的脚本都被破坏并返回错误的结果。 @Wiimm,根据定义,CSV 是面向行的。如果在字段中使用字段分隔符,则 OP 应明确提及。您可以查看OP评论。 一个 CSV 行可以覆盖 2 个或更多物理行(在 awk 的意义上)。字段可以包含换行符和逗号(都包含在引号中)。两者都被您的解决方案忽略了。 啊我明白@Wiimm 的意思,所以基本上如果数据包含换行符,我们需要小心。幸运的是我的数据不包含换行符,但很高兴知道这种可能性存在 我在 csv 中发现了关于 awk 和换行符的类似问题。但因为我还是 awk 的新手,所以我将链接放在这里。 ***.com/questions/16094067/…【参考方案2】:

作为单一命令行的快速而肮脏的 php 解决方案:

php -r '$f=fopen("a.csv","rb"); $g=fopen("b.csv","wb"); while ( $r=fgetcsv($f) )  $r = array_slice($r,0,8); fputcsv($g,$r); '

它读取文件a.csv并写入b.csv

【讨论】:

以上是关于如何从巨大的 csv 文件中清除不良数据的主要内容,如果未能解决你的问题,请参考以下文章

如何将包含 200,00 行的巨大 CSV 文件导入 MySQL(异步且快速)?

如何使用 Python pandas 在 read_csv 期间识别不良记录?

有效地读取巨大的 csv 文件?

如何按行条件将巨大的 csv 文件读入 R?

从巨大的 CSV 文件中读取随机行

python脚本从巨大的(60000)JSON文件目录中提取特征到csv