【问题标题】:How do you compare values in a database and a flat file in Java?如何比较数据库中的值和 Java 中的平面文件中的值?
【发布时间】:2011-09-29 21:58:36
【问题描述】:

我有一个用竖线分隔的平面文件和一个数据库表。我想创建一个包含平面文件和数据库之间所有差异的第二个平面文件。

例如,如果数据库中存在平面文件中不存在的条目,则整行将打印在第二个平面文件中(平面文件中永远不会有不在数据库中的条目)。另一个示例是,如果行相似但字段存在差异,则数据库条目将打印在平面文件中。

我能想到的最好方法是创建 2 个二维数组,其中包含来自平面文件和数据库的数据,如果平面文件数组中不存在主键,则从选择语句。如果主键确实存在但其他字段不存在,则从 select 语句中打印出结果。这是我能想到的最好的事情,但它似乎效率低下。

有没有更好的方法来做到这一点?我正在使用 Java 来执行此操作。

【问题讨论】:

  • 大多数数据库都具有直接读取文件的功能——整个操作可以通过 SQL 完成,并且比应用程序语言具有更好的扩展性。
  • 你在说什么数据量,源文件是有序的吗?如果可以从数据库访问平面文件,我倾向于使用 SQL/外部表解决方案。如果数据量很小,java 可以解决问题。

标签: java database oracle flat-file


【解决方案1】:

编写 Java 程序,从数据库中获取数据到 另一个 平面文件中,格式与您已有的文件相同。

确保两个文件按相同的字段排序,例如,记录的主键 - 可以通过awk 来实现,例如在这样的输入文件的情况下(排序键是最后一个数字):

val1|2
val7|1

您可以按sort -n --field-separator=\| -k 2 1 对条目进行排序(有关所涉及选项的说明,请参见sort 手册页)。

然后使用diff(或类似的,如果您不在 Unix/Linux 上)实用程序来创建具有不同条目的文件。

【讨论】:

  • 如果返回的数据库结果与平面文件的顺序不同怎么办?如果提供的平面文件根本无法保证顺序,那就更糟糕了。
  • @mtrovo - 在从数据库检索之前读取密钥的平面文件
【解决方案2】:

既然您已经在与数据库进行比较,为什么不直接在 SQL 中进行呢?将文件内容上传到数据库,找到两个补码(A减B和B减A)并导出到另一个文件。比如:

SPOOL diff.txt
SELECT * FROM flatfile_table
MINUS
SELECT * FROM db_table
UNION
SELECT * FROM db_table
MINUS
SELECT * FROM flatfile_table
ORDER BY SortCriteria;
SPOOL OFF

【讨论】:

    【解决方案3】:

    在 oracle 中,您可以从文件 tutorial for external tables 创建外部表

    然后创建简单的选择,这将在您的数据之间建立差异,然后简单地导出

    【讨论】:

      【解决方案4】:

      我会这样做:

      • 将数据库中的结果加载到 Map 结构中,其中键是主键列,值是行本身
      • 迭代平面文件集合,根据主键搜索 Map 结构,并将差异添加到将作为输出的列表中。
      • 将您之前保存在列表中的差异写入输出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-11
        • 1970-01-01
        • 2021-07-03
        • 1970-01-01
        • 2020-08-30
        • 2012-02-06
        相关资源
        最近更新 更多