在CSV导出中保留Java ResultSet中的列类型

时间:2015-07-31 02:04:57

标签: resultset export-to-csv spss-modeler

我目前正在构建一个直接从数据库中提取数据的工具,因为SPSS Modeler太慢并且首先将它存储在Java ResultSet中。

但我尝试将数据导出为CSV(或类似)文件,尝试保留尽可能多的列类型。 目前我正在使用 opencsv ,但它会将Decimal和其他许多内容转换为String。当我将文件加载回SPSS Modeler时,我只得到整数和字符串。

是否有任何CSV库(可能带有特殊编码)或其他文件类型我可以用它来导出数据及其列类型(如IBM InfoSphere Data Architect可以做到的)所以我可以直接将它加载回SPSS Modeler而不用在那里手动更换它?

谢谢!

1 个答案:

答案 0 :(得分:0)

从数据库信息模式中检索元数据

如果数据当前存储在数据库中,则可以从信息架构中检索列类型。您需要做的就是在查询表后检索此信息并将其存储,以便以后可以重复使用。

// connect to DB as usual
Statement stmt = conn.createStatement();
// create your query
// Note that you can use a dummy query here. 
//You only need to access the metadata schema of the table, regardless of the actual query.
ResultSet rse = stmt.executeQuery("Select A,B FROM table WHERE ..");
// get the ResultSetMetadata
ResultSetMetaData rsmd = rse.getMetaData();

// Get database specific type
rsmd.getColumnTypeName(1); // database specific type name for column 1 (e.g. VARCHAR)
rsmd.getColumnTypeName(2); // database specific type name for column 2 (e.g. DateTime)
....

// Get generic JDBC type http://docs.oracle.com/javase/7/docs/api/java/sql/Types.html
rsmd.getColumnType(1) // generic type for col 1 (e.g. 12)
rsmd.getColumnType(2) // generic type for col 2

处理

您可以将此信息存储在CSV schema中,并在转换过程中对其进行处理。 我建议您使用此处提供的SuperCSV。 该库提供了所谓的单元处理器,允许您定义列的类型。

说明

  

单元处理器是使用Super CSV进行读写的不可或缺的一部分 - 它们可以自动执行数据类型转换并强制执行约束。它们实现了责任链设计模式 - 每个处理器都有一个明确定义的目的,可以与其他处理器链接在一起,以完全自动化单个CSV列的所有必需转换和约束验证。