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

用于将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

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

我尝试使用开源Java库解析和上载CSV文件,例如:

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

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

    但是,我有以下问题:

  • 我找不到在Java中获取SQL*Loader的错误/日志并向用户显示它们的方法

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

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

    在SQLite上,我使用.import命令上载CSV文件。但我不可能用Java来称呼它

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

    请告诉我你的建议


    谢谢。

    如果您有可用的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语句。无论您使用什么数据库引擎,此过程都是相同的。谢谢您的建议。我已经加上了“