通过JDBC在CSV文件上执行SQL

问题描述:

我需要对CSV文件(以逗号分隔的文本文件)应用SQL查询。我的SQL是从另一个工具预定义的,并且没有资格更改。它可能包含FROM部分中的嵌入式选择和表别名。通过JDBC在CSV文件上执行SQL

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

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

这是我遇到的问题:

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

从我考虑/尝试的4件事情来看,只有3件和4件似乎对我而言可行。有关这些的任何建议,或者我可以查询我的CSV文件的任何其他方式?

干杯

如果你的SQL是预定义的,不能改变你的最佳选择是将您的CSV加载到数据库中,并对其运行查询。

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

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

+0

是的,它使用子串和连接。 – 2009-09-24 13:22:57

我会说嵌入式数据库。我建议Javadb(内置于Java API中的Derby)或者H2,如果你不在意拉动额外的依赖。

我会加载数据到HSQL(HypersonicSQL)。纯Java,正确的SQL,久经考验。其他任何东西都有更大的占地面积。

+1

实际上,HSQLDB是唯一可以将现有CSV文件作为SQL表打开的建议解决方案。它允许直接在CSV文件上执行SQL查询并更新记录。 – fredt 2010-11-21 13:43:21

+1

http://hsqldb.org/doc/guide/ch06.html包含更多详细信息 – 2012-01-23 11:37:19

+0

Hi @Vladimir如果我想处理的csv文件在5到10 GB的范围内非常大? – u449355 2014-05-31 17:43:56

有一个Groovy脚本,gcsvsql可以让你将csv文件视为数据库表,包括连接。随着gcsvsql你可以做这样的事情:

gcsvsql “选择people.csv *,其中年龄> 40”

gcsvsql“选择 people.name,孩子。从 people.csv,children.csv其中 people.name = children.name”

gcsvsql “选择AVG(分数)从 people.csv其中年龄< 40”

你可以找到孩子这个脚本,是基于H2数据库引擎,在谷歌代码在这里:

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

如果你想从一个Java程序中处理的CSV文件的数据库,你应该看看h2 database engine.它对读取/写入CSV文件和使用内存数据库有非常好的支持。它是hsql的继任者,速度更快,并具有增加的功能。你可以在h2教程中阅读关于csv的支持。

+0

您可以阅读这篇博客文章中使用h2在Groovy脚本中使用h2的方式: http://bayesianconspiracy.blogspot.com/2010 /02/executing-arbitrary-sql-on-csv-files.html – Kolmogorov 2010-04-01 00:10:50

可能有点晚,对不起。

我一直在开发csvjdbc一年多了,自从几个星期以来,我对该项目拥有“管理员”权利,因此我能够发布我制作的最新版本。它确实需要我们需要的所有“我们”(我们:我和我现在的我的同事们),并且在错误归档时添加内容。

现在看看它,然后再决定。 (网络文档仍然需要审查,以获得更好的洞察力,检查非常广泛的测试用例)。

+0

嵌入式选择?表别名?不,在那里还没有。但后来,随时提交一个非工作查询错误报告,谁知道... – mariotomo 2010-05-29 07:28:13

我知道,这是一个非常古老的情况下,但是......

CsvJdbc是一个很酷的库,但也有使用DbUtils而映射到ResultsSets POJO的一些问题。 第二件坏事是,对不同数据类型的dos没有很好的支持。

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

+0

你有报告与csvjdbc的问题?当前的维护者(不再是我)很快就会提出严重问题。 – mariotomo 2015-07-03 12:12:33

+0

不,我没有。我无法在那里创建票。 – Mirko 2015-07-06 08:10:23

+0

您应该可以在登录/注册后在那里创建票证。匿名用户不允许创建或更新票据。我想为了避免垃圾邮件发送者......但更具体地说,你遇到了什么“一些问题”,以及你期望什么“良好支持”? – mariotomo 2015-07-11 16:32:39