Java 通过JDBC在CSV文件上执行SQL
我需要对CSV文件(逗号分隔的文本文件)应用SQL查询。我的SQL是从另一个工具预定义的,不能更改。它可能在FROM零件中包含嵌入的SELECT和表格别名 在我的任务中,我找到了两个提供JDBC驱动程序的开源库(这是项目要求):Java 通过JDBC在CSV文件上执行SQL,java,sql,text,jdbc,csv,Java,Sql,Text,Jdbc,Csv,我需要对CSV文件(逗号分隔的文本文件)应用SQL查询。我的SQL是从另一个工具预定义的,不能更改。它可能在FROM零件中包含嵌入的SELECT和表格别名 在我的任务中,我找到了两个提供JDBC驱动程序的开源库(这是项目要求): 创建ApacheDerby数据库,将所有CSV作为表加载并执行查询 以下是我遇到的问题: 它不接受SQL的语法(它使用内部选择和表别名)。此外,自2004年以来一直没有维持 我无法让它工作,因为它依赖于SAX解析器,在解析其他文档时会导致异常。同样,自2004年以
干杯如果您的SQL是预定义的且无法更改,那么您最好的选择是将CSV加载到数据库中并对其运行查询 ApacheDerby是一个可行的选择,我们也是,它甚至有一个or
您的SQL是否使用任何专有函数/扩展?如果是这样,那可能会限制您的选择。我想说嵌入式数据库。如果您不关心额外的依赖关系,我建议使用Javadb(内置于JavaAPI中的Derby)或H2。我会将数据加载到HSQL(HypersonicSQL)中。纯Java,正确的SQL,经过良好验证。几乎其他任何东西都有更大的占用空间。有一个Groovy脚本gcsvsql,它允许您将csv文件视为数据库表,包括联接。使用gcsvsql,您可以执行以下操作: gcsvsql“从people.csv中选择* 年龄>40岁 gcsvsql“选择 人物。姓名,儿童。儿童来源 people.csv,children.csv在哪里 people.name=children.name“ gcsvsql“从中选择平均值(分数) people.csv,其中年龄<40“ 您可以在Google代码中找到这个基于h2数据库引擎的脚本:
如果您想从Java程序中将csv文件视为数据库,您应该看看它对读取/写入csv文件和使用内存数据库的支持。它是hsql的后续产品,速度更快,并添加了更多功能。您可以在h2教程中阅读有关csv支持的内容。可能有点晚了,对此表示抱歉 我已经开发了一年多了,从几个星期开始,我就拥有了该项目的“管理员”权限,所以我能够发布我制作的最新版本。它满足了所有“我们”的需要(我们:我和我现在的同事们),我在bug归档时添加了一些东西
现在看一看,然后再作决定。(web文档仍然需要审阅,为了更好地理解,请检查测试用例,它们非常广泛)。我知道,这是一个非常古老的用例,但是 是一个很酷的库,但是在将ResultSets映射到POJO时使用时存在一些问题。 第二件坏事是,没有对不同数据类型的良好支持
玩过之后,我将使用一个愚蠢的CsvParser来读取文件,并将它们输入HsqlDB或类似的东西。是的,它使用子字符串和连接。在这篇博文中,你可以看到在Groovy脚本中使用h2是多么容易:嵌入式选择?表格别名?没有,那里还没有。但话说回来,你可以随意用一个不起作用的查询来提交一个bug报告,谁知道呢……事实上,HSQLDB是唯一建议的可以将现有CSV文件作为SQL表打开的解决方案。它允许直接在CSV文件上执行SQL查询和更新记录。Hi@Vladimir如果我要处理的CSV文件非常大(5到10 GB),该怎么办?我没有尝试使用HSQL处理那么大的文件,但文档中说最大的文件是8 TB(T,不是G)。您需要使用createcachedtable来避免将数据保留在内存中。看看HSQL->Text表:您报告过csvjdbc的问题吗?当前的维护人员(不再是我)在发现严重问题时非常及时。不,我没有。我无法在那里创建票证。您应该能够在登录/注册后在那里创建票证。不允许匿名用户创建或更新票证。我想为了避免垃圾邮件发送者。。。但更具体地说,你遇到了什么“问题”,你期望得到什么“良好的支持”?