为csvjdbc表设置Integer,Double和String columnTypes

时间:2013-06-24 07:44:19

标签: sql csv jdbc

我正在尝试使用csvjdbc驱动程序从csv文件中选择不同的字段。我有一个csv表,如:

id        departmentcode     fte
223356    DS3G5530DK         1.0
234335    ES4K44343L         0.8
435331    GS2K54534P         1.0
...

我想将列导入为Integer,String和Double,因此我创建了一个Java.Util.Properties对象并添加了列类型:

Properties props = new Properties();
props.put("columnTypes", "Integer,String,Double");

之后,我与属性对象建立连接并查询csv:

Connection conn = DriverManager.getConnection("jdbc:relique:csv:" +getPath()+"/temp/", props);
ResultSet results = stmt.executeQuery("SELECT id, departmentcode, fte FROM tempCSV WHERE ...")

while (results.next()) {
    ...
    System.out.println( results.getInt("id") );
    System.out.println( results.getString("departmentcode") );
    System.out.println( results.getDouble("fte") );
    ...
}

但是当我从结果中选择DEPARTMENT-CODE时,它总是一个双精度值(0.0)。对于idfte,它都按预期进行(因为id是一个int而fte是一个double。我的属性对象有问题吗?

3 个答案:

答案 0 :(得分:0)

经过大量的反复试验后,我想我确实理解了这个问题。 columnTypes似乎表现得很奇怪。首先,每个列都在最后一个columnType中解析(对我而言,它将是Double)。在解析为该columnType之后,数据将转换为给定类型(对我来说可能是IntegerStringDouble)。

这就是出错的地方:将String对象解析为Double将产生0.0。我通过删除整个columnType属性并在我的sql where语句中添加单引号来修复它。

答案 1 :(得分:0)

CSV文件每行的值之间的分隔符是什么? CsvJdbc中的默认值是逗号。您可以将其他分隔符设置为数据库属性。例如,

props.put("separator", "|");

或者你的文件在每一行都有固定宽度的列?在这种情况下,您可以设置fixedWidths数据库属性以定义每列的宽度。

答案 2 :(得分:0)

您需要在属性中添加以下内容:

props.put("fixedWidths", "1-10,11-30,31-32");

(指定列的起点和终点)