通过JDBC在CSV文件上执行SQL
我需要对CSV文件(以逗号分隔的文本文件)应用SQL查询。我的SQL是从另一个工具预定义的,并且没有资格更改。它可能包含FROM部分中的嵌入式选择和表别名。通过JDBC在CSV文件上执行SQL
对于我的任务,我已经发现了两个开源(这是一个项目的要求)提供的JDBC驱动程序库:
- CsvJdbc
- XlSQL
- JBoss Teiid
- 创建Apache Derby DB,将所有CSV作为表格加载并执行查询。
这是我遇到的问题:
- 它不接受SQL的语法(它使用内部选择和表的别名)。此外,它自2004年以来一直未得到维护。
- 我无法让它工作,因为它具有SAX解析器,在解析其他文档时会导致异常。同样,自2004年以来没有变化。
- 没有检查它是否支持语法,但看起来像一个开销。它需要几个实体定义(虚拟数据库,绑定)。从邮件列表中他们告诉我最后一个版本支持运行时创建所需的对象。有没有人使用它来完成这个简单的任务(通常它可以连接到CSV,XML或其他DBS等数据类型并创建一个虚拟的,统一的数据)?
- 这甚至可以轻松完成吗?
从我考虑/尝试的4件事情来看,只有3件和4件似乎对我而言可行。有关这些的任何建议,或者我可以查询我的CSV文件的任何其他方式?
干杯
如果你的SQL是预定义的,不能改变你的最佳选择是将您的CSV加载到数据库中,并对其运行查询。
Apache Derby是一个可行的选择,MySQL也是一个可行的选择,它甚至有一个CSV storage engine或PostgreSQL。
您的SQL是否使用任何专有功能/扩展?如果是这样,那可能会限制你的选择。
我会说嵌入式数据库。我建议Javadb(内置于Java API中的Derby)或者H2,如果你不在意拉动额外的依赖。
我会加载数据到HSQL(HypersonicSQL)。纯Java,正确的SQL,久经考验。其他任何东西都有更大的占地面积。
有一个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数据库引擎,在谷歌代码在这里:
如果你想从一个Java程序中处理的CSV文件的数据库,你应该看看h2 database engine.它对读取/写入CSV文件和使用内存数据库有非常好的支持。它是hsql的继任者,速度更快,并具有增加的功能。你可以在h2教程中阅读关于csv的支持。
您可以阅读这篇博客文章中使用h2在Groovy脚本中使用h2的方式: http://bayesianconspiracy.blogspot.com/2010 /02/executing-arbitrary-sql-on-csv-files.html – Kolmogorov 2010-04-01 00:10:50
是的,它使用子串和连接。 – 2009-09-24 13:22:57