csv - 根据列值拆分大型csv文本文件

标签 csv text split large-data

我有多个已排序的列的 CSV 文件。例如,我可能有这样的行:

19980102,,PLXS,10032,Q,A,,,15.12500,15.00000,15.12500,2
19980105,,PLXS,10032,Q,A,,,14.93750,14.75000,14.93750,2
19980106,,PLXS,10032,Q,A,,,14.56250,14.56250,14.87500,2
20111222,,PCP,63830,N,A,,,164.07001,164.09000,164.12000,1
20111223,,PCP,63830,N,A,,,164.53000,164.53000,164.55000,1
20111227,,PCP,63830,N,A,,,165.69000,165.61000,165.64000,1

我想根据第 3 列分割文件,例如将 PLXS 和 PCP 条目放入它们自己的名为 PLXS.csv 和 PCP.csv 的文件中。因为文件恰好是预先排序的,所以所有 PLXS 条目都在 PCP 条目之前,依此类推。

我通常最终在 C++ 中做这样的事情,因为这是我最了解的语言,但在这种情况下,我的输入 CSV 文件有几 GB 并且太大而无法在 C++ 中加载到内存中。

有人可以展示如何做到这一点吗? Perl/Python/php/bash 解决方案都可以,它们只需要能够处理大文件而不会占用过多内存。

最佳答案

如果您最了解 C++,则它很好。无论如何,您为什么要尝试将整个文件加载到内存中?

由于输出取决于正在读取的列,因此您可以轻松地为输出文件存储缓冲区,并在处理时将记录填充到适当的文件中,同时进行清理以保持相对较小的内存占用。

当需要从数据库中提取大量数据时,我会这样做(尽管是在 Java 中)。记录被推送到文件缓冲区流中,内存中的任何内容都被清除,因此程序的占用空间永远不会超过它最初开始时的占用空间。

坐我的裤子伪代码:

  • 创建一个列表来保存您的输出文件缓冲区
  • 打开文件上的流并开始一次一行地读取内容
  • 我们是否遇到过针对其内容类型具有打开文件流的记录?
  • 是的 -
  • 获取存储的文件流
  • 将记录存储到该文件中
  • 冲洗流
  • 不 -
  • 创建一个流并将其保存到我们的流列表
  • 将记录存储在流中
  • 冲洗流
  • 重复冲洗...

  • 基本上继续这个处理,直到我们到达文件的末尾。

    由于我们从不存储指向流的指针,并且我们在写入流时立即刷新,因此除了输入文件中的一条记录外,我们不会在应用程序的内存中保存任何驻留的内容。因此,足迹保持可管理。

    关于csv - 根据列值拆分大型csv文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9951393/

    相关文章:

    javascript - 根据链接文本的内容添加类

    python - 除了所有输入数据之外,还将 re.findall() 输出到 CSV

    MySQL:将csv导入带引号的表中

    css - 在导航菜单中隐藏文本

    html - 在内联 div 中调整大小时如何在 div 不先移动到新行的情况下使文本换行?

    arrays - Snowflake - 如何将单个字段(VARIANT)拆分为多个列

    xml - BASH SHELL SCRIPT 将一个大的 xml 文件拆分成多个小文件

    javascript - 按空格拆分字符串但不在括号内

    python - 使用 python 多重处理读取多个 CSV 文件并将数据插入表中,而不使用 pandas

    mysql - Excel CSV 到 Mysql 数据库