【发布时间】:2011-09-22 08:54:05
【问题描述】:
我有一个预生成的 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();
但是当我删除文件并再次运行时,同样的事情不起作用!我收到错误
表已存在:语句 [CREATE TEXT TABLE 货币] 中的 CURRENCY
另外,如果我有一个预先存在的 csv 文件(格式正确,因为我能够使用 CsvJDBC 运行一个简单的 select 语句)然后我得到错误
未找到表:语句 [SET TABLE rms] 中的 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"));
}
}
有人可以解释一下吗?
谢谢
【问题讨论】: