首页 文章

使用HSQLDB JDBC驱动程序的CSV上的SQL

提问于
浏览
2

我有一个预生成的CSV文件,我需要在其上运行SQL查询 . 我一直在寻找不同的开源解决方案(例如CsvJdbc,xlSQL等),但还没有找到任何令人满意的东西 .

CsvJdbc无法识别ORDER BY,GROUP BY等xlSQL只能在XLS文件上运行,而不能在CSV上运行(或者我无法使用CSV运行它 . 有人知道怎么做?) . 此外,它还没有开发或支持 .

我在某处读到HSQLDB支持查询CSV文件,但我无法正常工作 . 这是我到目前为止所做的事情:

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

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();

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

表已存在:语句中的CURRENCY [CREATE TEXT TABLE currency]

此外,如果我有一个预先存在的csv文件(格式是正确的,因为我能够使用CsvJDBC运行一个简单的选择语句)然后我得到错误

未找到表:语句中的RMS [SET TABLE rms]

代码为此

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"));
    }
}

有人可以对此有所了解吗?

谢谢

1 回答

  • 3

    单个HSQLDB数据库可以有许多表,包括几个TEXT表 . 您似乎认为每个文本表必须有一个数据库,但情况并非如此 .

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

    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链接,方法与第一个示例相同 .

相关问题