2013-11-01 59 views
1

我想将sql查询的结果集导出到csv文件。我正在使用opencsv导出到csv文件。我正在使用下面的代码来实现它。打开csv导出结果集

ResultSet rs = statement.executeQuery(queryString); 
CSVWriter writer = new CSVWriter(new fileWriter "testFile.csv"), '|',CSVWriter.NO_QUOTE_CHARACTER); 
writer.writeAll(rs, true); 

但我面对的问题是,它会自动导出到来自resultset的Databse列的数据类型。

例如,如果我与数据类型的列作为浮在数据类型中csv文件我看到作为100.00和另一列我看到的值作为2.041928E + 8 204192800.

但我想csv文件导出到字符串类型。它的值就像在DB中一样。

有人可以知道如何使用opencsv将结果类型导出为带有字符串数据类型的csv文件吗?任何帮助将非常感激。

回答

1

而另一种方案是, 创建自定义的ResultSet包装与你的真实结果集(源),并调用

此外,您还可以创建自定义的ResultSetMetaData包装,以响应ColumnType具有字符串。

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; 

}

} 
0

您可以创建您的SQL字符串有例如,与Oracle

例如:

select num||'',to_char(num2) from xxx 

或使用SQL数字格式化,并用字符串值,而不是数值的对结果集响应。

0

我认为最好的办法就是

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; 

    } 
} 
0

另一种选择是明确写入每一行。这是一个相当简单的方法,其优点是可以使用“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(); 
}