通过JDBC在CSV文件上执行SQL

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

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

  1. CsvJdbc
  2. XlSQL
  3. JBoss Teiid
  4. 创建Apache Derby DB,将所有CSV加载为表并执行查询。

这些是我遇到的问题:

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

从我考虑/试过的4件事中,只有3件和4件对我来说是可行的。 有关这些或任何其他方式我可以查询我的CSV文件的任何建议吗?

干杯

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

Apache Derby是一个可行的选择, MySQL也是如此,它甚至还有一个CSV存储引擎或PostgreSQL 。

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

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

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

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

也许有点晚了,对不起。

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

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

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

gcsvsql“select * from people.csv where age> 40”

gcsvsql“select people.name,children.child from people.csv,children.csv where people.name = children.name”

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

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

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

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

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

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