【问题标题】:Setting Integer, Double and String columnTypes for csvjdbc table为 csvjdbc 表设置 Integer、Double 和 String 列类型
【发布时间】:2013-06-20 15:48:40
【问题描述】:

我正在尝试使用 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)。我的属性对象有问题吗?

【问题讨论】:

    标签: sql csv jdbc


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        你需要在你的属性中添加这样的东西:

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

        (指定列的起点和终点)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-11-09
          • 1970-01-01
          • 2012-05-09
          • 1970-01-01
          • 2021-04-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多