最后,这个问题在没有 CSVJdbc 或 SuperCSV 驱动程序的情况下解决了。这些驱动程序工作正常。有可能的 CSV 文件形式的查询数据和许多功能内容。就我而言,我不需要来自 CSV 的查询数据。不幸的是,有时描述列包含一个或多个分号,它是我的分隔符。
首先,我检查@Maher Abuthraa 的回答代码并修改为:
private String createDescriptionFromResult(ResultSet resultSet, int columnCount) throws SQLException {
if (columnCount > 2) {
StringBuilder data_list = new StringBuilder();
for (int ii = 2; ii <= columnCount; ii++) {
data_list.append(resultSet.getString(ii));
if (ii != columnCount)
data_list.append(";");
}
// data_list has all data from all index you are looking for ..
return data_list.toString();
} else {
// use standard way
return resultSet.getString(2);
}
}
循环从 2 开始,因为 1 列是代码,只有描述列内容很多分号。CSVJdbc 驱动程序按分隔符拆分列;
,这些分号从列数据中消失。因此,除了最后一列外,我在描述中显式添加分号,因为它与我的情况无关。
此代码工作正常。但没有解决我所有的问题。当我调整 CSV 标题中的两列时,行中出现错误,其内容超过两个分号。所以我尝试调整忽略标题或将许多列名(或简单;
)添加到标题中。在 superCSV 中忽略 headers 选项工作正常。
我的同事的意见是:您不需要 CSV 驱动程序,因为如果分隔符有时是相关数据,请尝试加载不是 CSV 的 CSV。
我认为我的同事是对的,我使用以下代码加载了 CSV 数据:
InputStream in = null;
try {
in = new ByteArrayInputStream(csvData);
List lines = IOUtils.readLines(in, "UTF-8");
Iterator it = lines.iterator();
String line = "";
while (it.hasNext()) {
line = (String) it.next();
String description = null;
String code = null;
String[] columns = line.split(";");
if (columns.length >= 2) {
code = columns[0];
String[] dest = new String[columns.length - 1];
System.arraycopy(columns, 1, dest, 0, columns.length - 1);
description = org.apache.commons.lang.StringUtils.join(dest, ";");
(...)