通过JDBC在CSV文件上执行SQL

时间:2009-09-23 23:15:10

标签: java sql text jdbc csv

我需要将SQL查询应用于CSV文件(以逗号分隔的文本文件)。我的SQL是从其他工具预定义的,不符合更改条件。它可能包含FROM部分中的嵌入式选择和表别名。

对于我的任务,我发现了两个提供JDBC驱动程序的开源(这是一个项目要求)库:

  1. CsvJdbc
  2. XlSQL
  3. JBoss Teiid
  4. 创建Apache Derby DB,将所有CSV加载为表格并执行查询。
  5. 这些是我遇到的问题:

    1. 它不接受SQL的语法(它使用内部选择和表别名)。此外,它自2004年以来一直没有得到维护。
    2. 我无法让它工作,因为它具有SAX Parser的依赖性,在解析其他文档时会导致异常。同样,自2004年以来没有变化。
    3. 没有检查它是否支持语法,但似乎是一种开销。它需要几个实体定义(虚拟数据库,绑定)。从邮件列表中,他们告诉我,上一版本支持运行时创建所需对象。有没有人用它来完成这么简单的任务(通常它可以连接到几种类型的数据,如CSV,XML或其他DBS,并创建一个虚拟的统一数据)?
    4. 这可以轻松完成吗?
    5. 从我考虑/试过的4件事中,只有3件和4件对我来说是可行的。有关这些或任何其他方式我可以查询我的CSV文件的任何建议吗?

      干杯

7 个答案:

答案 0 :(得分:9)

我会将数据加载到HSQL(HypersonicSQL)中。纯Java,正确的SQL,经过充分验证。几乎任何其他东西都有更大的足迹。

答案 1 :(得分:3)

如果您的SQL是预定义的并且无法更改,那么您最好的选择是将CSV加载到数据库中并对其运行查询。

Apache Derby是一个可行的选择,MySQL也是如此,它甚至有CSV storage enginePostgreSQL

您的SQL是否使用任何专有功能/扩展?如果是这样,那可能会限制您的选择。

答案 2 :(得分:3)

我会说嵌入式数据库。我建议使用Javadb(内置于Java API中的Derby)或H2,如果你不关心是否需要额外的依赖。

答案 3 :(得分:1)

如果您想将Java程序中的csv文件视为数据库,您应该查看h2 database engine.它非常支持读取/写入CSV文件和使用内存数据库。它是hsql的后续版本,速度更快,并且具有附加功能。您可以在h2教程中阅读有关csv支持的内容。

答案 4 :(得分:1)

也许有点晚了,对不起。

我一直在开发csvjdbc一年多了,几周后我就获得了该项目的“管理员”权限,所以我已经能够发布我生产的最新版本。它完全符合我们所需要的(我们:我和我现在的同事),并且我在添加错误时会添加内容。

现在看看它并再次决定。 (Web文档仍需要审阅,为了更好地了解,请检查非常广泛的测试用例)。

答案 5 :(得分:0)

有一个Groovy脚本gcsvsql,它允许您将csv文件视为数据库表,包括连接。使用gcsvsql,您可以执行以下操作:

  

gcsvsql“select * from people.csv   年龄> 40"

     

gcsvsql“选择   people.name,children.child来自   people.csv,children.csv在哪里   people.name = children.name“

     

gcsvsql“从中选择avg(得分)   people.csv年龄< 40"

您可以在此处的Google代码中找到此脚本,该脚本基于h2数据库引擎:

http://code.google.com/p/gcsvsql/

答案 6 :(得分:0)

我知道,这是一个非常古老的案例,但是......

CsvJdbc是一个很酷的库,但在将ResultsSets映射到PoJos时使用DbUtils会出现一些问题。 第二个坏处是,它不能很好地支持不同的数据类型。

使用CSVJdbc后,我将使用一个愚蠢的CsvParser来读取文件,将它们泵入HsqlDB或类似的东西。