首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用HSQLDB驱动程序在CSV上使用SQL

使用HSQLDB驱动程序在CSV上使用SQL
EN

Stack Overflow用户
提问于 2011-09-22 08:54:05
回答 1查看 4.9K关注 0票数 2

我有一个预先生成的CSV文件,需要在该文件上运行SQL查询。我一直在研究不同的开源解决方案(例如CsvJdbc、xlSQL等),但并没有发现任何令人满意的东西。

CsvJdbc无法识别ORDER,而GROUP只在XLS文件上运行,而不是CSV (或者我无法让它与CSV一起运行)。有人知道怎么做吗?)。另外,它已经不在开发或支持中了。

我在某个地方读到HSQLDB支持查询CSV文件,但我一直无法正确地工作。以下是我到现在为止所做的事情:

如果我使用HSQLDB创建一个CSV文件,那么它就能够成功地执行查询。这是它的代码:

代码语言:javascript
复制
String driver = "org.hsqldb.jdbcDriver";
Driver d = (Driver) Class.forName(driver).newInstance();
String protocol = "jdbc:hsqldb:file";
final String url = "jdbc:hsqldb:file:/C:/Users/varun.achar/Documents";

final StringBuilder createTable = new StringBuilder();
createTable.append("CREATE TEXT TABLE currency (");
createTable.append("id INT PRIMARY KEY, name VARCHAR)");
final StringBuilder linkTable = new StringBuilder();
linkTable.append("SET TABLE currency SOURCE ");
linkTable.append("\"/currencies.csv");
linkTable.append(";ignore_first=true;all_quoted=true\"");
Connection conn = DriverManager.getConnection(url, "sa", "");
Statement stm = conn.createStatement();
stm.execute(createTable.toString());
stm.execute(linkTable.toString());
ResultSet resultSet = stm.executeQuery("SELECT * FROM CURRENCY");
if (resultSet != null) {
    while (resultSet.next()) {
        System.out.println("CURRENCY = " + resultSet.getString(2));
    }
}
conn.close();

但是,当我删除该文件并再次运行它时,同样的事情不起作用!我知道错误了

表已经存在:语句中的货币创建文本表货币

另外,如果我有一个预先存在的csv文件(格式是正确的,因为我能够使用CsvJDBC运行一个简单的select语句),那么我就会得到错误。

未找到

表:语句集表RMS中的rms

此代码

代码语言:javascript
复制
final StringBuilder linkTable = new StringBuilder();
linkTable.append("SET TABLE rms SOURCE ");
linkTable.append("\"C:/myreports/temp/user/1316083232009/rms.csv");
linkTable.append(";ignore_first=true;all_quoted=true\"");
Driver d = (Driver) Class.forName(driver).newInstance();
System.out.println("Driver was successfully loaded.");
String protocol = "jdbc:hsqldb:file";
String database = "C:\\myreports\\temp\\user\\1316083232009\\rms.csv";
String url = protocol + ":" + database;
con = DriverManager.getConnection(url);
stm = con.createStatement();
stm.execute(linkTable.toString());
resultSet = stm.executeQuery(testSQLStatement());
if (resultSet != null) {
    while (resultSet.next()) {
        System.out.println("FULL NAME = "+ resultSet.getString("usr_FULL_NAME"));
    }
}

有人能给这件事放点光吗?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-22 11:57:35

单个HSQLDB数据库可以包含多个表,包括多个文本表。似乎您认为每个文本表必须有一个数据库,但事实并非如此。

数据库路径不是目录。它也不是CSV文件。在第一个示例中,您应该指定一个数据库名,如下所示:

代码语言:javascript
复制
final String url = "jdbc:hsqldb:file:/C:/Users/varun.achar/Documents/mydb";

在第二个例子中也是如此。

该数据库由几个文件组成,以您所分隔的名称开头。在本例中,您将拥有mydb.propertiesmydb.script等。

CREATE TEXT TABLE ...语句为表创建元数据。此表元数据将持久化在数据库中。

然后,第一个示例将起作用。如果删除CSV文件,然后打开数据库,“create TEXT table”语句仍然存储在数据库中,因此当您再次尝试创建相同的表时,它会发出抱怨。

如果您有一个预先存在的CVS文件,仍然需要从CREATE TEXT TABLE ...开始,然后使用SET TABLE语句将其链接到CVS,这与第一个示例相同。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7512119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档