Java 打开csv以将结果集导出为字符串类型

Java 打开csv以将结果集导出为字符串类型,java,csv,export-to-csv,opencsv,Java,Csv,Export To Csv,Opencsv,我想将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); 但我面临的问题是,它会自动导出

我想将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);
但我面临的问题是,它会自动导出到来自resultset的数据库列的数据类型

例如,如果我在csv文件的数据类型中看到一个列的数据类型为float,那么我将看到100.00,对于另一个列,我将看到204192800的值为2.041928E+8

但我想将csv文件导出为字符串类型。以DB为单位的值


有人知道如何使用opencsv将resulttype导出为具有字符串数据类型的csv文件吗?非常感谢您的帮助。

您可以创建SQl has字符串示例

oracle的示例:

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

或者使用Sql数字格式化程序,结果集响应使用字符串值而不是数字值。

您可以创建Sql has字符串示例

oracle的示例:

  select num||'',to_char(num2) from xxx 
或者使用Sql数字格式化程序,结果集响应使用字符串值而不是数字值。

另一种解决方案是, 使用真实结果集(源)创建自定义结果集包装器并调用

此外,您还可以创建自定义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;
另一个解决办法是, 使用真实结果集(源)创建自定义结果集包装器并调用

此外,您还可以创建自定义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;

我认为最好的办法是

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;

  }
}

我认为最好的办法是

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;

  }
}

另一种选择是显式地写入每一行。这是一个相当简单的方法,其优点是您可以使用“ApplyQuotesToll”参数让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();
}
publicstaticvoidtocsv(结果集rs、输出流os)
抛出SQLException,IOException{
CSVWriter CSVWriter=新的CSVWriter(新的OutputStreamWriter(os));
ResultSetMetaData元数据=rs.getMetaData();
int columnCount=metadata.getColumnCount();
String[]column=新字符串[columnCount];

对于(int i=1;i另一个选项是显式地写入每一行。这是一个相当简单的方法,其优点是您可以使用“ApplyQuotesToll”参数使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();
}
publicstaticvoidtocsv(结果集rs、输出流os)
抛出SQLException,IOException{
CSVWriter CSVWriter=新的CSVWriter(新的OutputStreamWriter(os));
ResultSetMetaData元数据=rs.getMetaData();
int columnCount=metadata.getColumnCount();
String[]column=新字符串[columnCount];
对于(int i=1;i