【问题标题】:How to compare two big unsorted CSV files using Spring Batch?如何使用 Spring Batch 比较两个未排序的大 CSV 文件?
【发布时间】:2016-04-08 14:45:58
【问题描述】:

我的任务是比较两个大的 csv 文件并将比较结果写入一个新文件。文件 1 有 200k 行,文件 2 也可能有 200K 或更少。两者都有 200 列。文件没有排序,可以按任何顺序排列。我正在使用 Java 8 和 Spring 版本 4。

问题

我在我的项目中使用 Spring Batch,有什么方法可以使用 Spring Batch 自定义的 ItemReader 和 ItemWriter 来实现这一点,还是应该使用 tasklet,然后使用纯 Java 代码来比较文件?我也想以最快的方式做到这一点。数据量真的很大,可能是 2-4 Gigs,所以我不想将它加载到内存中。文件结构如下所示。

文件 1:
regn_nbr,name,address1,countrycode,regn_date
2345,John,4332 JFK Boulevard,US,02-12-2011
2347,mark,4332 Maryland Avenue,US,04-27-2015
2348,Smith,4332 JFK road,US,07-30-2011
2302,Andy,4332 JFK Lane,US,06-01-2010

文件 2:
regn_nbr,name,address1,countrycode,regn_date
2345,John,4332 JFK Boulevard,US,02-12-2011
2302,Andy,4332 JFK Lane,US,06-01-2010
2911,彼得,12 蜡烛驱动器,MX,01-01-2010
2348,Smith,4332 JFK road,US,07-30-2011
2347,mark,4332 Maryland Avenue,US,04-27-2015

我们非常欢迎您提出建议、不同的方法、策略和专业知识。

【问题讨论】:

  • Spring Batch 绝对是这个错误的选择。它适用于批处理,而您的问题至少需要在处理数据之前对数据进行排序。
  • @Kayaman。感谢您的回复。是的,它是一个批处理应用程序,我们已经经历了很多阶段,比如通过 FTP、数据库和各种来源以及大量业务处理来提取多个文件。我们整合了来自不同来源的数据并形成了这些文件。现在我们处于比较阶段。所以我的计划是对两个文件进行排序,在文件中插入缺少的记录键,然后将其传递给处理器以比较值。只是想知道没有排序我可以实现这种比较吗?
  • 这样看吧。您从第一个文件中取出第一行,从第二个文件中取出第一行。第二个文件中的行与第一个文件中的行不对应。然后,您必须检查整个第二个文件以查看该行是否存在,或者它是否已被删除,这在批处理中实际上不起作用(也不会有效)。如果没有某种预处理,你就无法做到这一点。我会把它全部存入数据库。
  • 这里也一样。将一个文件中的行插入到一个表中,将第二个文件中的行插入到另一个表中并执行NOT EXISTS SELECT。

标签: java memory spring-integration spring-batch file-comparison


【解决方案1】:

你确定你需要一个特殊的程序吗?

我会试试

如果内存确实是您最关心的问题,那么它所需要的只是一些 java 主类,一些 java niosimple java sql

【讨论】:

  • 我使用内存中的 HSQL-DB 来存储然后处理文件。这是非常快速和高效的。谢谢迈克尔
【解决方案2】:

我认为最好的方法是读取文件并创建两个代表文件结构的特定 java bean 列表。这些 bean 可以实现 Comparable,您可以编写一个方法,该方法可以将列表与您编写的特定规则进行排序和比较。

【讨论】:

    猜你喜欢
    • 2018-06-26
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 2022-01-04
    相关资源
    最近更新 更多