用于将CSV文件上载到数据库的Java Desktop应用程序

时间:2011-10-11 05:13:43

标签: java sql oracle csv etl

我正在开发桌面应用程序(Extract Transform Load类型的应用程序),需要将大型CSV文件(大约6 GB)上传到数据库,使用Java作为前端,Oracle作为后端,但我对其他人开放数据库和工具(即SQLite,H2,HSQLDB,MySQL)。

我尝试使用OpenSource Java库来解析和上传CSV文件,例如:

  1. OpenCSV
  2. Super CSV
  3. 这些库的问题在于效率。他们需要太多时间上传。例如,上传4 Gb的CSV文件需要6个小时。

    有了这段经验,我决定尝试上传CSV文件的数据库工具。其中之一是Oracle SQL * Loader。它更快,并提供理想的结果。它可以删除空格,将CSV文件加载到各种表中,使用诸如解码之类的oracle函数等。

    但是,我有以下问题:

    1. 我找不到用Java获取SQL * Loader的错误/日志并将其显示给用户的方法。

    2. 由于SQL * Loader是专有的,因此无法将其嵌入到我的应用程序安装中。例如,用户需要在安装我的应用程序之前单独下载和安装Oracle Client。另一件事是我需要在安装过程开始之前检查是否安装了Oracle客户端。

    3. 我寻找其他可能的解决方案,并找到了像SQLite和H2这样的无头数据库。

      在SQLite上,我使用.import命令上传CSV文件。但是我无法用Java调用它。

      我转向H2数据库但我很难上传,因为它不支持转义标题行。

      请告诉我你的建议。

      谢谢你。

3 个答案:

答案 0 :(得分:1)

如果你有一个bash shell,你可以这样做:

sqlite3 my_database_file <<< .import <(gawk 'NR>1 { a = $0; if(NR>2){print a;}}' my_csv_file) my_table_name

答案 1 :(得分:0)

我假设您正在使用SQLITE命令行管理实用程序。

最简单的方法是在导入文件中删除页眉和页脚行,然后使用您在系统中最熟悉的编辑功能将其导入sqlite。

如果您发布的样本文件是准确的,则无论如何都必须这样做,因为最后一行(只包含一列)将被SQLITE .import命令拒绝,导致整个输入被中止。 / p>

如果你修复了页脚问题,并坚持使用SQLITE命令,这是一个建议的技术:

修复页脚

HEADER1, HEADER2, HEADER3
row1,row2,row3
row11,row22,row33
row111,row222,row33
FOOTER, FOOT1, FOOT2

执行导入

sqlite> select * from test;
HEADER1, HEADER2, HEADER3
row1,row2,row3
row11,row22,row33
row111,row222,row33
FOOTER, FOOT1, FOOT2

删除页脚

sqlite> select count() from test;
5
sqlite> delete from test where rowid=5;

删除标题

sqlite> delete from test where rowid=1;
sqlite> select * from test;
row1,row2,row3
row11,row22,row33
row111,row222,row33

答案 2 :(得分:0)

听起来你可以使用CloverETL。它是基于Java的数据集成和ETL工具。除了商业版本,它还有一个免费的opensource ETL engine。将应用程序作为Java库嵌入应该非常容易。除非瓶颈在数据库端,否则您也不应该遇到上面提到的任何性能问题。据说CloverETL很快。

如果您需要了解其他技术细节,可以问我或使用CloverETL forum