我正在开发桌面应用程序(Extract Transform Load类型的应用程序),需要将大型CSV文件(大约6 GB)上传到数据库,使用Java作为前端,Oracle作为后端,但我对其他人开放数据库和工具(即SQLite,H2,HSQLDB,MySQL)。
我尝试使用OpenSource Java库来解析和上传CSV文件,例如:
这些库的问题在于效率。他们需要太多时间上传。例如,上传4 Gb的CSV文件需要6个小时。
有了这段经验,我决定尝试上传CSV文件的数据库工具。其中之一是Oracle SQL * Loader。它更快,并提供理想的结果。它可以删除空格,将CSV文件加载到各种表中,使用诸如解码之类的oracle函数等。
但是,我有以下问题:
我找不到用Java获取SQL * Loader的错误/日志并将其显示给用户的方法。
由于SQL * Loader是专有的,因此无法将其嵌入到我的应用程序安装中。例如,用户需要在安装我的应用程序之前单独下载和安装Oracle Client。另一件事是我需要在安装过程开始之前检查是否安装了Oracle客户端。
我寻找其他可能的解决方案,并找到了像SQLite和H2这样的无头数据库。
在SQLite上,我使用.import命令上传CSV文件。但是我无法用Java调用它。
我转向H2数据库但我很难上传,因为它不支持转义标题行。
请告诉我你的建议。
谢谢你。
答案 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。