java csv半冒号问题

时间:2016-10-19 09:18:13

标签: java regex csv separator

我必须修改一个程序。该程序使用数据库中的列创建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;在一行中说明?

感谢您的帮助

3 个答案:

答案 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)

你可以替换“;”在创建像这样的csv行之前

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

最后,如果你想弄乱别人,用希腊问号替换你的分号。