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

在Java中,如何比较数据库和平面文件中的值?,java,database,oracle,flat-file,Java,Database,Oracle,Flat File,我有一个管道分隔的平面文件和一个数据库表。我想创建第二个平面文件,其中包含平面文件和数据库之间的所有差异 例如,如果数据库中存在平面文件中不存在的条目,则整行将打印在第二个平面文件中,平面文件中永远不会有不在数据库中的条目。另一个例子是,如果行相似,但字段中存在差异,则数据库条目将打印在平面文件中 我认为最好的方法是创建两个二维数组,其中包含平面文件和数据库中的数据,如果平面文件数组中不存在主键,则打印select语句中的结果。如果主键确实存在,但其他字段不存在,则打印select语句的结果。这

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

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

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


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

编写Java程序,将数据库中的数据以与现有文件相同的格式保存到另一个平面文件中

确保两个文件按同一字段排序,例如,记录的主键-可通过awk实现,例如,如果输入文件排序键为最后一个数字:

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


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

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

在oracle中,可以从文件创建外部表


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

在映射结构上加载数据库中的结果,其中键是主键列,值是行本身 迭代平面文件集合,根据主键搜索映射结构,并将差异添加到将作为输出的列表中。 将先前保存在列表中的差异写入输出。
如果返回的数据库结果与平面文件的结果顺序不同,该怎么办?即使是最糟糕的情况,如果提供的平面文件上根本没有顺序保证。@mtrovo-在从DBMost数据库检索之前读取该密钥的平面文件具有直接读取文件的功能-整个操作可以通过SQL完成,并且比应用程序语言的扩展性更好。您所说的数据量是多少?源文件是否有序?如果可以从DB访问平面文件,我倾向于使用SQL/外部表解决方案。如果数据量很小,java就可以做到这一点。