如何比较Java中数据库和平面文件中的值?

时间:2011-07-06 19:23:36

标签: java database oracle flat-file

我有一个管道分隔的平面文件和一个数据库表。我想创建一个第二个平面文件,其中包含平面文件和数据库之间的所有差异。

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

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

有更好的方法吗?我正在使用Java来做到这一点。

4 个答案:

答案 0 :(得分:1)

由于您已经在与数据库进行比较,为什么不在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

答案 1 :(得分:1)

在oracle中,您可以从文件tutorial for external tables

创建外部表

然后创建一个简单的选择,它将在您的数据之间建立差异,然后只需导出

答案 2 :(得分:0)

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

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

val1|2
val7|1

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

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

答案 3 :(得分:0)

我会做这样的事情:

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