Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.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 Apache公共CSV格式化程序:IOException:封装的令牌和分隔符之间的字符无效_Java_Csv_Apache Commons_Opencsv_Apache Commons Csv - Fatal编程技术网

Java Apache公共CSV格式化程序:IOException:封装的令牌和分隔符之间的字符无效

Java Apache公共CSV格式化程序:IOException:封装的令牌和分隔符之间的字符无效,java,csv,apache-commons,opencsv,apache-commons-csv,Java,Csv,Apache Commons,Opencsv,Apache Commons Csv,我正在尝试使用JakartaCommons CSV解析CSV文件 样本输入文件 Field1,Field2,Field3,Field4,Field5 "Ryan, R"u"bianes"," dummy@gmail.com","29445","626","South delhi, Rohini 122001" 格式化程序:CSVFormat.newFormat(',')。withIgnoreEmptyLines()。withQuote('“')) CSV_分隔符为 输出 CSV解析后的Fie

我正在尝试使用JakartaCommons CSV解析CSV文件

样本输入文件

Field1,Field2,Field3,Field4,Field5
"Ryan, R"u"bianes","  dummy@gmail.com","29445","626","South delhi, Rohini 122001"
格式化程序:CSVFormat.newFormat(',')。withIgnoreEmptyLines()。withQuote('“')) CSV_分隔符为

输出

  • CSV解析后的Field1值应为:Ryan,R“u”bianes
  • CSV解析后的字段5值应为:南德里,Rohini 122001

  • 异常:由以下原因引起:java.io.IOException:(第2行)封装的标记和分隔符之间的字符无效

    问题是您的文件没有遵循CSV文件中引用的公认标准。在引用字符串中表示引用的正确方法是重复引用。例如

    Field1,Field2,Field3,Field4,Field5
    "Ryan, R""u""bianes","  dummy@gmail.com","29445","626","South delhi, Rohini 122001"
    
    如果您将自己限制为CSV引用的标准形式,Apache Commons CSV解析器应该可以工作

    不幸的是,为变量格式编写一致的解析器是不可行的,因为如果需要表示包含“
    Ryan R”、“baines
    ”的字段,则无法消除嵌入的逗号和字段分隔符的歧义


    CSV文件中的引号规则在不同的地方都有规定,包括。

    这里的问题是引号没有正确转义。您的解析器无法处理这一点。请尝试,因为这是我知道的唯一一个可以处理引号内未转义引号的java解析器。它也比Commons CSV快4倍。请尝试以下代码:

        //configure the parser to handle your situation
        CsvParserSettings settings = new CsvParserSettings();
        settings.setHeaderExtractionEnabled(true); //uses first line as headers
        settings.setUnescapedQuoteHandling(STOP_AT_CLOSING_QUOTE);
        settings.trimQuotedValues(true); //trim whitespace around values in quotes
    
        //create the parser
        CsvParser parser = new CsvParser(settings);
    
        String input = "" +
                "Field1,Field2,Field3,Field4,Field5\n" +
                "\"Ryan, R\"u\"bianes\",\"  dummy@gmail.com\",\"29445\",\"626\",\"South delhi, Rohini 122001\"";
    
        //parse your input
        List<String[]> rows = parser.parseAll(new StringReader(input));
    
        //print the parsed values
        for(String[] row : rows){
            for(String value : row){
                System.out.println('[' + value + ']');
            }
            System.out.println("-----");
        }
    
    希望能有帮助


    披露:我是这个库的作者,它是开源和免费的(Apache 2.0许可证)

    “Ryan,R”u“bianes”“
    处理此问题,请检查我的其他answer@stephen-有没有办法跳过这一行,继续处理下一组行?看看Commons CSV解析器代码,我想答案是否定的。@stephen-c这也是我的直觉,通过查看代码,但这是一个理想情况下应该存在的功能。任何建议的解决方法。我正在考虑这样做{try{while(csvRecords.hasNext()){csvrecordrecord=csvRecords.next();}}}catch(异常e){log.error(“解析一条输入记录时发生异常”);}}while(csvRecords.hasNext());这可能有用。(试试看!!!)但我怀疑。在抛出异常之前,我没有注意到任何代码要跳到行的末尾。对于我问题中的讨厌的示例,它做了什么?请仔细查看。它通过正确处理未替换的引号来解析您的中断输入。正如您所看到的,我使用了您的示例输入进行测试。因为它是一个简单的字符串,所以我在每个引号前面加了斜杠。将此代码与实际输入文件一起使用。
    [Ryan, R"u"bianes]
    [dummy@gmail.com]
    [29445]
    [626]
    [South delhi, Rohini 122001]
    -----