用于将CSV文件上载到数据库的Java桌面应用程序
我正在开发桌面应用程序(Extract Transform Load类型的应用程序),该应用程序需要将大型CSV文件(约6 GB)上载到使用Java作为前端和Oracle作为后端的数据库,但我也对其他数据库和工具持开放态度(即SQLite、H2、HSQLDB、MySQL) 我尝试使用开源Java库解析和上载CSV文件,例如: 这些库的问题是效率。他们需要太多的时间上传。例如,上传4 Gb的CSV文件需要6个小时 有了这个经验,我决定尝试使用数据库实用程序上传CSV文件。其中之一是Oracle SQL*Loader。它的速度更快,并提供理想的结果。它可以删除空白,将CSV文件加载到各种表中,使用诸如解码等oracle功能 但是,我有以下问题:用于将CSV文件上载到数据库的Java桌面应用程序,java,sql,oracle,csv,etl,Java,Sql,Oracle,Csv,Etl,我正在开发桌面应用程序(Extract Transform Load类型的应用程序),该应用程序需要将大型CSV文件(约6 GB)上载到使用Java作为前端和Oracle作为后端的数据库,但我也对其他数据库和工具持开放态度(即SQLite、H2、HSQLDB、MySQL) 我尝试使用开源Java库解析和上载CSV文件,例如: 这些库的问题是效率。他们需要太多的时间上传。例如,上传4 Gb的CSV文件需要6个小时 有了这个经验,我决定尝试使用数据库实用程序上传CSV文件。其中之一是Oracle
谢谢。如果您有可用的bash shell,可以执行以下操作:
sqlite3 my_database_file <<< .import <(gawk 'NR>1 { a = $0; if(NR>2){print a;}}' my_csv_file) my_table_name
sqlite3 my_database_file如果有可用的bash shell,可以执行以下操作:
sqlite3 my_database_file <<< .import <(gawk 'NR>1 { a = $0; if(NR>2){print a;}}' my_csv_file) my_table_name
sqlite3我的数据库文件我假设您正在使用SQLITE命令行管理实用程序
最简单的方法是在将导入文件导入sqlite之前,从导入文件中删除页眉和页脚行,使用您在系统上最熟悉的任何编辑功能
如果您发布的示例文件是准确的,那么无论如何都必须这样做,因为最后一行(仅包含一列)将被SQLITE.import命令拒绝,从而导致整个输入被中止
如果您解决了页脚问题,并坚持使用SQLITE命令,则建议使用以下技术:
修正页脚
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> select * from test;
HEADER1, HEADER2, HEADER3
row1,row2,row3
row11,row22,row33
row111,row222,row33
FOOTER, FOOT1, FOOT2
删除页脚
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
我假设您正在使用SQLITE命令行管理实用程序
最简单的方法是在将导入文件导入sqlite之前,从导入文件中删除页眉和页脚行,使用您在系统上最熟悉的任何编辑功能
如果您发布的示例文件是准确的,那么无论如何都必须这样做,因为最后一行(仅包含一列)将被SQLITE.import命令拒绝,从而导致整个输入被中止
如果您解决了页脚问题,并坚持使用SQLITE命令,则建议使用以下技术:
修正页脚
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> select * from test;
HEADER1, HEADER2, HEADER3
row1,row2,row3
row11,row22,row33
row111,row222,row33
FOOTER, FOOT1, FOOT2
删除页脚
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
听起来你可以用这个。它是一个基于Java的数据集成和ETL工具。除了商业版,它还有一个免费的。作为Java库嵌入到应用程序中应该很容易。您也不应该有上面提到的任何性能问题,除非瓶颈在DB端。据说克洛弗雷特很快
如果您需要了解其他技术细节,可以询问我或使用。听起来您可以使用。它是一个基于Java的数据集成和ETL工具。除了商业版,它还有一个免费的。作为Java库嵌入到应用程序中应该很容易。您也不应该有上面提到的任何性能问题,除非瓶颈在DB端。据说克洛弗雷特很快
如果您需要了解其他技术细节,可以询问我或使用。您必须使用SQLite吗?不能使用外部表加载数据吗?排除页眉和页脚很容易使用外部表。一点也不。我正在创建一个java桌面应用程序,它可以尽可能快地将一个大的.csv文件加载到我的本地数据库,而不考虑数据库。你必须使用SQLite吗?不能使用外部表加载数据吗?排除页眉和页脚很容易使用外部表。一点也不。我正在创建一个java桌面应用程序,它可以尽可能快地将一个大的.csv文件加载到我的本地数据库,而不考虑数据库。谢谢你,但我没有bash。我在windows平台上工作。顺便说一句,它不必是SQLite。它可能是嵌入我的Java桌面应用程序中的另一个数据库,可以以闪电般的速度加载大型CSV文件。@user692533如果您安装Cygwin(不知道这是否是最佳解决方案;只需说一句即可)。谢谢您,但我没有bash。我在windows平台上工作。顺便说一句,它不必是SQLite。它可能是另一个可以嵌入到我的Java桌面应用程序中的数据库,可以以闪电般的速度加载大型CSV文件。@user692533如果您安装Cygwin(不知道这是否是最好的解决方案;只需说“in”),您可以这样做。谢谢您的帮助。如果我错了,请纠正我,但我发现我不能使用SQLite,因为它缺少在java中导入大型csv文件的功能。您应该在问题中提到您使用的是java。如果添加java标记,将引起java专家的注意。简单地说,您应该编写java代码来读取csv文件,解析它并生成所需的SQL INSERT语句。无论您使用什么数据库引擎,此过程都是相同的。谢谢您的建议。我已经加上了“