我必须修改一个程序。该程序使用数据库中的列创建csv文件,如下所示:
csvBuilder.initCsvFile();
csvBuilder.createRow(headers.toArray(new String[headers.size()]));
while (resultSet.next()) {
String[] row = new String[resultSetColumnCount];
int columnIndex = 1;
while (columnIndex <= resultSetColumnCount) {
Object object = resultSet.getObject(columnIndex);
if (object == null) {
row[columnIndex - 1] = "";
} else {
row[columnIndex - 1] = object.toString();
}
columnIndex++;
}
csvBuilder.createRow(row);
}
initCsvFile方法:
public void initCsvFile() {
try {
writer = new CSVWriter(new FileWriter(filePath), ';', CSVWriter.NO_QUOTE_CHARACTER);
} catch (IOException e) {
logger.error("CsvBuilder : error when creating {}", filePath, e);
throw new CsvException("Error when creating the file : " + filePath, e);
}
}
createRow方法:
public void createRow(String[] row) {
writer.writeNext(row);
}
问题是,我有一些数据包括分隔符&#39 ;;&#39;如下所示,
id col1 col2
1 US United;States
不幸的是,csv文件将United和States分为两部分。如何检查resultSet的内容并转义分隔符而不修改所有程序以获得United;在一行中说明?
感谢您的帮助
答案 0 :(得分:2)
在这些情况下,你需要一些引用字符,否则会有歧义;在您的情况下,您指示它不使用引号,因此,它无法处理这些案例。
尝试明确定义引号字符:
public void initCsvFile() {
try {
writer = new CSVWriter(new FileWriter(filePath), ';', '"');
} catch (IOException e) {
logger.error("CsvBuilder : error when creating {}", filePath, e);
throw new CsvException("Error when creating the file : " + filePath, e);
}
}
请记住,在这种情况下,任何可能导致含糊不清的数据都将包含在引号之间:
1;US;"United;States"
这是有效的CSV,大多数CSV解析器会在阅读时自动删除引号。
答案 1 :(得分:1)
while (resultSet.next()) {
String[] row = new String[resultSetColumnCount];
int columnIndex = 1;
while (columnIndex <= resultSetColumnCount) {
Object object = resultSet.getObject(columnIndex);
if (object == null) {
row[columnIndex - 1] = "";
} else {
// replace ";" by ""
row[columnIndex - 1] = object.toString().replace(";", "");
}
columnIndex++;
}
csvBuilder.createRow(row);
}
答案 2 :(得分:1)
我刚遇到类似的问题。显然,字符串应该使用双引号进行转义,以防止出现此类问题。所以我创建了一个65803.98
函数:
escapeCSVDatum()
所以在你的情况下,它将在这里适用
private static String escapeCSVDatum(String s){
return "\""+s.replace("\"", "\"\"").replace("\n", " ")+"\"";
}
然而,正如Haroldo_OK所述,您对} else {
row[columnIndex - 1] = escapeCSVDatum(object.toString());
}
的使用使得无法正确对待此类案件。在具有此属性的基准中不可能有分号。
因此,您可能希望修改代码以用空格替换分号,例如
CSVWriter.NO_QUOTE_CHARACTER
最后,如果你想弄乱别人,用希腊问号替换你的分号。