【问题标题】:Open CSV to export resultset to string type打开 CSV 以将结果集导出为字符串类型
【发布时间】:2013-11-12 15:24:14
【问题描述】:

我想将 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 文件中的数据类型为 float 的列,我看到的是 100.00,而对于另一列,我看到的值为 2.041928E+8 的 204192800。

但我想将 CSV 文件导出为字符串类型。数据库中的值。

如何使用 opencsv 将结果类型导出为字符串数据类型的 CSV 文件?

【问题讨论】:

    标签: java csv export-to-csv opencsv


    【解决方案1】:

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

    此外,您可以创建自定义 ResultSetMetaData Wrapper 以响应 ColumnType 具有 String。

        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;
    

    }

    }
    

    【讨论】:

      【解决方案2】:

      你可以创建你的 SQl 有字符串的例子,

      oracle 示例:

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

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

      【讨论】:

        【解决方案3】:

        我认为最好的方法是

        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;
        
          }
        }
        

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-12-05
            • 1970-01-01
            • 2016-07-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-09-05
            相关资源
            最近更新 更多