【问题标题】:Read .csv file in GB's using Java使用 Java 读取 GB 中的 .csv 文件
【发布时间】:2016-05-06 10:08:10
【问题描述】:

我有以下两个要求:

  1. 读取 CSV 文件并将行逐行放入数据库 (RDSMS),无需任何数据操作。
  2. 读取 CSV 文件并将此数据放入数据库 (RDBMS)。在这种情况下,Z 行可能依赖于 B 行。因此需要有一个暂存数据库(内存中或另一个暂存 RDBMS)

我正在分析多种方法来实现这一点:

  • 使用Core java,以Producer-consumer方式读取文件。
  • 使用 Apache Camel 和 BeanIO 读取 csv 文件。
  • 使用 SQL 读取文件。

想知道,是否有行业定义的首选方式来执行此类任务?

我在 stackoverflow 上找到的链接很少,但我正在寻找更多选项:

我正在使用 Java6 来实现。

【问题讨论】:

  • 我不知道您使用的是什么数据库,但例如 MySQL 有一个名为 READ DATA INFILE 的工具,它非常快,可以将大型 CSV 文件加载到表中。您能告诉我们您使用的是哪个数据库吗?
  • DB2 有LOAD 命令,用于读取和加载格式良好的 csv 文件。您可以编写一个脚本来进行额外的验证等。这些实用程序的缺点是缺少事务管理等。
  • 我们使用的RDBMS是MSSQL 11.0
  • 另外,我们应该有逻辑在Java层还是DB层解析CSV?是否有任何行业首选的方法?
  • “行业标准”的答案是总是,这取决于。您是否正在将一个 CSV 文件加载到数据库中?每天一个 CSV 文件到数据库?每秒 100,000 个 CSV 文件到数据库?您需要提供更多详细信息,然后才能有人给您一个“行业标准”的答案。

标签: java csv file-io java-6


【解决方案1】:

您应该使用 NIO 包以 GB 为单位执行此类操作。 NIO 是异步的,迄今为止最快且最可靠。您可以通过 NIO 打包简单地读取块中的文件,然后使用批量命令而不是单次插入插入到数据库中。单次插入会占用大量 CPU 周期,并可能导致 OOM 错误。

【讨论】:

  • Nio 可从 java 1.4 获得
【解决方案2】:

我们正在使用 Apache Camel 的“File:”协议来读取文件并处理数据。

【讨论】:

    【解决方案3】:

    你可以使用RandomAccessFile来读取csv文件,它给你足够快的读取速度,它不需要任何额外的jar文件,这里是代码,

       File f=new File(System.getProperty("user.home")+"/Desktop/CSVDOC1.csv");
       RandomAccessFile ra = new RandomAccessFile(f,"rw");
    
                            ra.seek(0);//Read from start 
                            long p=ra.getFilePointer();
                            String d= ra.readLine();
                            ra.seek(p);
                            while(d!=null){                     
    
                            //Each line data stored in variable d                                                       
                            d=ra.readLine();
    
                            //d="col1","col2","col2","col3" 
    
                            //Separate line data by separator ","
    
                            //insert row values into database                           
                            }
                            //Release file lock
                            ra.close();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 2013-03-10
      • 2021-07-13
      • 2017-10-02
      • 2022-11-12
      • 2012-10-17
      相关资源
      最近更新 更多