如何从巨大的 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(异步且快速)?