我试图将一个 ResultSet 对象转换为 CSV 格式的 String 对象。我尝试使用 OpenCV 将其转换为 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);
}
}
}
不要编写自己的方法,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();
new CsvRoutines().write(resultSet, stringWriter)
。希望这有所帮助! - Jeronimo Backes