将ResultSet转换为CSV格式的字符串

5
我试图将一个 ResultSet 对象转换为 CSV 格式的 String 对象。我尝试使用 OpenCV 将其转换为 CSV 文件,但我需要它作为字符串。有一个选项是先将其转换为文件,然后将数据转换为字符串,最后删除文件,但这将是一个额外的负担,我不能承受。
有没有办法实现它,我尝试搜索,但到目前为止还没有找到任何东西。

为什么不直接编写一个方法来完成它呢? - Alex
这将是我最后的选择 :) - HyperioN
使用OpenCV作为CSV格式化程序是否有些过度了?为什么不使用专用的CSV库,例如Apache Commons CSV或通过搜索网络找到的其他库? - Andreas
请在投票反对前说明原因 - HyperioN
2个回答

6

Apache Commons CSV

您也可以使用CSVPrinter来自Apache Commons CSV的工具。

CSVPrinter::printRecords( ResultSet )

方法CSVPrinter::printRecords接受一个ResultSet参数。

请参见以下示例代码中的关键行csvPrinter.printRecords(resultSet);

package org.myorg;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class QueryToCSV {

    public static void main(String[] args) throws IOException  {

        if ( args.length < 2)
            throw new IllegalArgumentException("Usage: QueryToCSV.jar <JDBCConnectionURL> <SQLForQuery> -> output to STDOUT and STDERR");

        // Create a variable for the connection string.
        String connectionUrl = args[0];
        String sqlQuery = args[1];
        try ( Connection conn = DriverManager.getConnection(connectionUrl); ) { 

            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));

            try (Statement st = conn.createStatement();) {
                ResultSet resultSet = st.executeQuery(sqlQuery);
                CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT.withHeader(resultSet));
                csvPrinter.printRecords(resultSet);
                csvPrinter.close();
            }
        }
        catch (SQLException e) {
            e.printStackTrace();
            System.exit(1);
        }
        catch (IllegalArgumentException ie) {
            System.err.println(ie.getMessage());
            System.exit(1);
        }
    }
}

3

不要编写自己的方法,CSV不仅仅是由逗号串联的字符串。关于引号、转义等方面存在几个问题。使用专门的库。个人推荐使用univocity-parsers来处理“损坏”的csv文件,但如果你要处理ResultSet,则可以使用opencsv库。

    StringWriter stringWriter = new StringWriter();
    CSVWriter csvWriter = new CSVWriter(stringWriter);
    csvWriter.writeAll(resultSet, true); // including column names
    String result = stringWriter.toString();

3
我是“univocity parsers”库的作者:您可以使用一行代码将结果集写入文件:new CsvRoutines().write(resultSet, stringWriter)。希望这有所帮助! - Jeronimo Backes
@JeronimoBackes 谢谢你的建议。我正在阅读文档,尝试使用 CsvParserSettings 设置分隔符:CsvParserSettings settings = new CsvParserSettings();settings.getFormat().setDelimiter('|');csvRoutines.setParserSettings(settings);csvRoutines.write(resultSet, stringWriter); 但是我仍然得到逗号分隔的输出。 - HyperioN
不用麻烦了,我已经解决了。必须使用CsvWriterSettings而不是CsvParserSettings。 - HyperioN
如果您只需要字符串,可以使用ResultSetHelperService(http://opencsv.sourceforge.net/apidocs/com/opencsv/ResultSetHelperService.html)替换CSVWriter,并调用getColumnValues方法,直到返回null或异常。每次调用将为您提供表示一行数据的字符串数组。这就是CSVWriter内部调用的内容。 - Scott Conway

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接