我想将 SQL 查询的结果集导出到 CSV 文件。我正在使用 opencsv 导出到 CSV 文件。我正在使用下面的代码来实现它。
ResultSet rs = statement.executeQuery(queryString);
CSVWriter writer = new CSVWriter(new fileWriter "testFile.csv"), '|',CSVWriter.NO_QUOTE_CHARACTER);
writer.writeAll(rs, true);
但我面临的问题是,它会自动导出到来自结果集的数据库列的数据类型。
示例:如果我在 CSV 文件中的数据类型中数据类型为浮点的列,我看到的是 100.00,对于另一列,我看到的值为 2.041928E+8 204192800。
但是我想将CSV文件导出为字符串类型。与数据库中的值一样。
如何使用 opencsv 将结果类型导出为具有字符串数据类型的 CSV 文件?
另一个解决方案是,使用实际结果集(源)创建自定义结果集包装器并调用
此外,您还可以创建自定义的结果集元数据包装器来响应列类型具有字符串。
writer.writeAll(new MyResultSet(rs), true);
//Wrapper class
public class MyResultSet implements Resultset{
public MyResultSet(Resultset source, Map<String, NumberFormat > formatters){
//setting constructor properties and you can read here SQL resultset Metadata to complete formatters
}
//.... you will implement all sql.Resultset methods
//example to implements
public String getString(String columnName){
return formatters.get(columnName).format(source.getInt(columnName));
}
public ResultSetMetaData getMetaData(){
return new MyResultSetMetaData(source);
}
}
}
//
public MyResultSetMetaData implements ResultSetMetaData{
//will implement all ResultSetMetaData methods,
//replace Numeric to String the column Type, then the value has retrieved by getString(column)
public int getColumnType(int columnIndex){
return Types.VARCHAR;
}
}
你可以创建你的 SQl 有字符串的例子,
甲骨文示例:
select num||'',to_char(num2) from xxx
或使用 Sql 数字格式化程序,以及带有字符串值而不是数字值的结果集响应。
我认为最好的方法是
writer.setResultService(new MyResultSetSevice());
writer.writeAll(rs, true);
并创建一个类
//http://opencsv.sourceforge.net/apidocs/index.html?au/com/bytecode/opencsv/CSVWriter.html
public class MyResultSetSevice implements ResultSetHelper{
public String[] getColumnValues(ResultSet rs)
{
return formattedColumnValues;
}
String[] getColumnValues(ResultSet rs, boolean trim) {
return formattedColumnValues;
}
}
另一种选择是显式编写每一行。这是一个相当简单的方法,其优点是您可以使用"applyQuotesToAll"参数让CSVWriter仅引用需要引号的值,而不是所有或什么都没有。
public static void toCSV(ResultSet rs, OutputStream os)
throws SQLException, IOException {
CSVWriter csvWriter = new CSVWriter(new OutputStreamWriter(os));
ResultSetMetaData metadata = rs.getMetaData();
int columnCount = metadata.getColumnCount();
String[] column = new String[columnCount];
for (int i = 1; i <= columnCount; i++) {
column[i-1] = metadata.getColumnName(i);
}
csvWriter.writeNext(column, false);
while (rs.next()) {
for (int i = 1; i <= columnCount; i++) {
column[i-1] = rs.getString(i);
}
csvWriter.writeNext(column, false);
}
csvWriter.close();
}