2011-10-11 132 views
1

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

我尝试使用开放源代码Java库,用于分析和上传CSV文件,如:

  1. OpenCSV
  2. Super CSV

的问题,这些库是效率。他们需要太多时间上传。例如,上传4 Gb的CSV文件需要6小时。

有了这个经验,我决定尝试数据库实用程序来上传CSV文件。其中之一是Oracle SQL * Loader。它更快,并提供理想的结果。它可以消除空格,CSV文件加载到各种表格,使用Oracle函数suchs作为解码等

不过,我有以下问题:

  1. 我无法找到一个办法让SQL *加载程序的错误/ Java日志并显示给用户。

  2. 因为SQL * Loader是专有的,所以没有办法将它嵌入到我的应用程序安装中。例如,用户需要在安装我的应用程序之前单独下载并安装Oracle Client。另一件事是我需要检查在安装过程开始之前是否安装了Oracle Client。

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

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

我转向H2数据库,但由于不支持转义标题行,所以我很难上传。

请让我知道您的建议。

谢谢你。

+0

你必须使用SQLite吗?你不能使用外部表来加载数据吗?使用外部表格很容易排除页眉和页脚。 – Ollie

+0

没有。我正在创建一个* java *桌面应用程序,它可以尽可能快地将大型.csv *文件加载到本地数据库,而不管数据库如何。 – epsac

回答

0

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

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

+0

非常感谢!这将对我的项目有很大的帮助。 :-) – epsac

1

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

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

谢谢,但我没有bash。我正在开发一个Windows平台。顺便说一句,它不一定是SQLite。它可能是嵌入到我的Java桌面应用程序中的其他数据库,并且可以以闪电般的速度加载大型CSV文件。 – epsac

+0

@ user692533如果你安装Cygwin,你会怎么做(不知道这是否是最好的解决方案;只是说)。 –

0

我假设你正在使用SQLite的命令行管理工具。

最简单的方法是将导入文件的页眉和页脚行导入到sqlite之前,使用您最喜欢的系统编辑功能。

如果您发布的示例文件是准确的,那么您将不得不这样做,因为最后一行(仅包含一列)将被SQLITE .import命令拒绝,从而导致整个输入中止。

如果解决页脚问题,并坚持使用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 
+0

谢谢你的帮助。纠正我,如果我错了,但我知道我不能使用SQLite,因为它缺乏在java中导入大型csv文件的功能。 – epsac

+0

你应该在你的问题中提到你正在使用java。如果你添加java标签,你会引起java专家的注意。简而言之,您应该编写java代码来读取您的csv文件,解析它并生成所需的SQL INSERT语句。不管你使用什么数据库引擎,这个过程都是一样的。 – ravenspoint

+0

谢谢你的建议。我已经在我的标签中添加了“java”并重新修改了我的问题。 – epsac

相关问题