Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java csv分号问题_Java_Regex_Csv_Separator - Fatal编程技术网

java csv分号问题

java csv分号问题,java,regex,csv,separator,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;

我必须修改一个程序。此程序在数据库中创建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);
    }
createRow方法:

public void createRow(String[] row) {
    writer.writeNext(row);
}
问题是,我有一些数据包含分隔符“;”如下图所示

id col1     col2   
1   US     United;States
不幸的是,csv文件将美国一分为二。如何检查resultSet的内容并跳出分隔符,而不修改所有程序以获得统一;一排的州


感谢您的帮助

在这种情况下,您需要一些引号字符,否则会出现歧义;在您的案例中,您指示它不要使用引号,因此,它无法处理这些案例

尝试显式定义引号字符:

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解析器在读取时会自动删除引号。

在这些情况下,您需要一些引号字符,否则会产生歧义;在您的案例中,您指示它不要使用引号,因此,它无法处理这些案例

尝试显式定义引号字符:

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解析器在读取时会自动删除引号。

您可以在创建这样的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);
    }
while(resultSet.next()){
String[]行=新字符串[resultSetColumnCount];
int columnIndex=1;
而(columnIndex您可以在这样创建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);
    }
while(resultSet.next()){
String[]行=新字符串[resultSetColumnCount];
int columnIndex=1;

而(columnIndex我刚刚遇到了一个类似的问题。显然,字符串应该用双引号转义,以防止此类问题。因此我创建了一个
escapeCSVDatum()
函数:

private static String escapeCSVDatum(String s){
    return "\""+s.replace("\"", "\"\"").replace("\n", " ")+"\"";
}
因此,在你的情况下,它将适用于这里

} else {
    row[columnIndex - 1] = escapeCSVDatum(object.toString());
}
但是,正如Haroldo__OK所述,您使用的
CSVWriter.NO_QUOTE_CHARACTER
无法正确处理此类情况。在具有此属性的数据中不可能有分号

因此,您可能希望修改代码以用空格替换分号,如下所示

} else {
    row[columnIndex - 1] = object.toString().replace(";"," ");
}

最后,如果你想惹人生气,用希腊问号替换分号。

我刚刚遇到了一个类似的问题。显然,字符串应该用双引号转义,以防止此类问题。因此我创建了一个
escapeCSVDatum()
函数:

private static String escapeCSVDatum(String s){
    return "\""+s.replace("\"", "\"\"").replace("\n", " ")+"\"";
}
因此,在你的情况下,它将适用于这里

} else {
    row[columnIndex - 1] = escapeCSVDatum(object.toString());
}
但是,正如Haroldo__OK所述,您使用的
CSVWriter.NO_QUOTE_CHARACTER
无法正确处理此类情况。在具有此属性的数据中不可能有分号

因此,您可能希望修改代码以用空格替换分号,如下所示

} else {
    row[columnIndex - 1] = object.toString().replace(";"," ");
}

最后,如果你想惹人生气,用希腊问号替换分号。

如果从原始数据中丢失不成问题,我会用replace()替换“;”,如果从原始数据中丢失它不是一个问题。只要丢失这些分号不是问题,这可能是一个好的解决方案。不幸的是,我不能释放分号,但谢谢你认为只要丢失这些分号不是问题,这可能是一个好的解决方案。不幸的是,我不能释放分号,但谢谢你认为这是正确的但是,我在csv文件中找到了围绕每个项目的“,”我想我没有选择。谢谢:)这是正确的,但是,我在csv文件中找到了围绕每个项目的“,”我想我没有选择。谢谢:)目前,我不能替换分号,但谢谢:)目前,我不能替换分号,但谢谢:)