基于文件(不在内存中)的CSV文件的JDBC驱动程序

时间:2011-09-27 11:21:05

标签: java jdbc csv

是否有针对CSV文件的基于开源文件(非基于内存的)JDBC驱动程序?我的CSV是根据用户选择从UI动态生成的,每个用户将拥有不同的CSV文件。我这样做是为了减少数据库命中,因为信息包含在CSV文件中。我只需要执行SELECT次操作。

如果我们指定索引,HSQLDB允许索引搜索,但是我将无法提供可用作索引的唯一列,因此它在内存中执行SQL操作。


修改

我尝试过CSVJDBC但不支持order bygroup by这样的简单操作。目前还不清楚它是从文件读取还是加载到内存中。

我尝试过xlSQL,但它再次依赖于HSQLDB,只适用于Excel,而不适用于CSV。此外,它还没有开发或支持。

H2,但只能读取CSV。不支持SQL。

5 个答案:

答案 0 :(得分:3)

您可以使用H2 database解决此问题。

以下groovy脚本演示:

  1. 将数据加载到数据库中
  2. 运行“GROUP BY”和“ORDER BY”sql查询
  3. 注意: H2支持内存数据库,因此您可以选择是否保留数据。

    // Create the database
    def sql = Sql.newInstance("jdbc:h2:db/csv", "user", "pass", "org.h2.Driver")
    
    // Load CSV file
    sql.execute("CREATE TABLE data (id INT PRIMARY KEY, message VARCHAR(255), score INT) AS SELECT * FROM CSVREAD('data.csv')")
    
    // Print results 
    def result = sql.firstRow("SELECT message, score, count(*) FROM data GROUP BY message, score ORDER BY score")
    
    assert result[0] == "hello world"
    assert result[1] == 0
    assert result[2] == 5
    
    // Cleanup
    sql.close()
    

    示例CSV数据:

    0,hello world,0
    1,hello world,1
    2,hello world,0
    3,hello world,1
    4,hello world,0
    5,hello world,1
    6,hello world,0
    7,hello world,1
    8,hello world,0
    9,hello world,1
    10,hello world,0
    

答案 1 :(得分:1)

如果您查看sourceforge项目csvjdbc,请报告您的expierences。文档说它对导入CSV文件很有用。

Project page

答案 2 :(得分:1)

超级用户https://superuser.com/questions/7169/querying-a-csv-file对此进行了讨论。

您可以使用hsqldb的文本表功能:http://hsqldb.org/doc/2.0/guide/texttables-chapt.html

csvsql / gcsvsql也是可能的解决方案(但是没有JDBC驱动程序,您必须为查询运行命令行程序)。

sqlite是另一种解决方案,但您必须先将CSV文件导入数据库,然后才能进行查询。

或者,有一些商业软件,例如http://www.csv-jdbc.com/,它可以做你想要的。

答案 3 :(得分:0)

要对文件执行任何操作,您必须在某些时候将其加载到内存中。您可以做的只是打开文件并逐行阅读,在您阅读新文件时丢弃上一行。这种方法的唯一缺点是其线性。您是否考虑在服务器上使用memcache之类的内容,在内存中使用键值存储,您可以查询而不是转储到CSV文件?

答案 4 :(得分:0)

您可以使用专用JDBC驱动程序,如CsvJdbc(http://csvjdbc.sourceforge.net),也可以选择配置数据库引擎(如mySQL)将CSV作为表格处理,然后通过标准操作CSV JDBC驱动程序。

此处的权衡 - 可用的SQL功能与性能。

  • 通过CsvJdbc(或类似文件)直接访问CSV将允许您对大数据卷进行非常快速的操作,但无法使用SQL命令对记录进行排序或分组;
  • mySQL CSV引擎可以提供丰富的SQL功能,但具有性能成本。

因此,如果表的大小相对较小 - 请使用mySQL。但是,如果您需要处理大文件(> 100Mb)而无需分组或排序 - 请使用CsvJdbc。 如果你需要两者 - 处理非常bif文件并能够使用SQL操作它们,那么最佳的操作方法 - 首先将CSV加载到普通数据库表(例如mySQL),然后像往常一样处理数据表。