java - Apache commons-csv 错误(带引号)

标签 java csv apache-commons-csv

我正在使用 org.apache.commons-csv 1.4,本周我在我们的一个 junit 测试中发现了这种奇怪的行为:

    CSVReader reader = null;
    List<String[]> linesCsv = new ArrayList<>();
    FileInputStream fileStream = null;
    InputStreamReader inputStreamReader = null;

    try {
        fileStream = new FileInputStream(file);
        inputStreamReader = new InputStreamReader(fileStream, "ISO-8859-1");
        reader = new CSVReader(inputStreamReader, ',', '"', 0);

        String[] record = null;
        while ((record = reader.readNext()) != null) {
            linesCsv.add(record);
        }

    } catch (Exception e) {
        logger.error("Error in ", e);
    } finally {
        if (inputStreamReader != null) {
            inputStreamReader.close();
        }
        if (fileStream != null) {
            fileStream.close();
        }
        if (reader != null) {
            reader.close();
        }
    }

*错误案例

输入.csv

DAR_123451                  ,"XXXXX Hello World "Hello World XXX "
DAR_123452                  ,"XXXXX Hello World "Hello World XXX "

Java KO:

[0.0] DAR_123451
[0.1] XXXXX Hello World “ Hello World XXX\nDAR_123456 ,XXXXX Hello World ” Hello World XXX

<小时/>

*正确案例

输入.csv

DAR_123451                  ,"XXXXX Hello World "Hello World" XXX "
DAR_123452                  ,"XXXXX Hello World "Hello World" XXX "

Java 好:

[0.0] DAR_123451 [0.1] XXXXX Hello World “ Hello World ”XXX

[1.0] DAR_123452 [1.1] XXXXX Hello World “ Hello World ”XXX

我无法设置commons csv库正常工作,这似乎是一个Bug,我们如何正确读取字符串中带有单引号的字符串?

最佳答案

如果值被引号括起来,例如,CSV 格式通常使用 2 个连续的双引号在文本中包含双引号。以下作品。

当我使用最新版本的 commons-csv 时,我什至在您的输入中遇到异常(IOException:(第 1 行)封装 token 和分隔符之间的无效字符)

因此,要正确包含双引号,您需要使用以下内容

DAR_123451                  ,"XXXXX Hello World ""Hello World"" XXX "
DAR_123452                  ,"XXXXX Hello World ""Hello World"" XXX "

然后测试用例按预期工作:

    Reader in = new StringReader(
            "DAR_123451                  ,\"XXXXX Hello World \"\"Hello World XXX\"\" \"\n" +
                    "DAR_123452                  ,\"XXXXX Hello World \"\"Hello World XXX\"\" \"");
    Iterable<CSVRecord> records = CSVFormat.DEFAULT.parse(in);
    for (CSVRecord record : records) {
        for (int i = 0; i < record.size(); i++) {
            System.out.println("At " + i + ": " + record.get(i));
        }
    }

输出:

At 0: DAR_123451                  
At 1: XXXXX Hello World "Hello World XXX" 
At 0: DAR_123452                  
At 1: XXXXX Hello World "Hello World XXX" 

参见https://en.wikipedia.org/wiki/Comma-separated_values#General_functionality了解详情。

关于java - Apache commons-csv 错误(带引号),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42114904/

相关文章:

java - new xxxBorder() 和 Borderfactory 方法之间的区别?

python - Pandas 的问题

java - 使用 apache commons 获取 CSV 文件头

java - Apache Commons CSV - 不区分大小写的标题?

Java:是否有可用的工具可以让我输入、存储和计算数学公式?

java - onJoin 事件不取代lastPlayer

python - 如何打印带有索引号的列表(python)?

python - 如何以 CSV 表格格式将原始数据源从 Google Big Query 导出到 R 服务器?

java - 如何通过 CSVParser 处理大文件?

java - LinkedHashMap 的 keySet() 和 values() 方法的行为