当前位置: 首页 > 面试题库 >

用Commons CSV解析CSV-引起IOException的引号中的引号

葛威
2023-03-14
问题内容

我正在使用Commons CSV来解析与电视节目有关的CSV内容。其中一个节目的节目名称带有双引号;

2010年9月10日116,6,2,29,“” JJ“(60分钟)”,“
http://www.tvmaze.com/episodes/4855/criminal-
minds-6x02-jj

节目名称为“ JJ”(60分钟),该名称已用双引号引起来。这在封装的令牌和定界符之间抛出IOException
java.io.IOException:(第1行)无效的char。

    ArrayList<String> allElements = new ArrayList<String>();
    CSVFormat csvFormat = CSVFormat.DEFAULT;
    CSVParser csvFileParser = new CSVParser(new StringReader(line), csvFormat);

    List<CSVRecord> csvRecords = null;

    csvRecords = csvFileParser.getRecords();

    for (CSVRecord record : csvRecords) {
        int length = record.size();
        for (int x = 0; x < length; x++) {
            allElements.add(record.get(x));
        }
    }

    csvFileParser.close();
    return allElements;

CSVFormat.DEFAULT已设置withQuote(’“’)

我认为此CSV的格式不正确,应设置为““ JJ”“(60分钟)”“” JJ“(60分钟)”-但是有没有办法让通用CSV处理此问题,或者我需要手动修复此条目?

附加信息:其他显示名称在CSV条目中包含空格和逗号,并放在双引号中。


问题答案:

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

//configure the parser to handle your situation
CsvParserSettings settings = new CsvParserSettings();
settings.setUnescapedQuoteHandling(STOP_AT_CLOSING_QUOTE);

//create the parser
CsvParser parser = new CsvParser(settings);

//parse your line
String[] out = parser.parseLine("116,6,2,29 Sep 10,\"\"JJ\" (60 min)\",\"http://www.tvmaze.com/episodes/4855/criminal-minds-6x02-jj\"");

for(String e : out){
    System.out.println(e);
}

这将打印:

116
6
2
29 Sep 10
"JJ" (60 min)
http://www.tvmaze.com/episodes/4855/criminal-minds-6x02-jj

希望能帮助到你。

披露:我是该库的作者,它是开源的并且免费的(Apache 2.0许可证)



 类似资料:
  • 我正在尝试使用OpenCSV解析CSV文件。其中一列以YAML序列化格式存储数据,并被引用,因为其中可以包含逗号。它里面也有引号,所以它通过放两个引号来转义。我能够在Ruby中轻松解析这个文件,但使用OpenCSV我无法完全解析它。这是一个UTF-8编码的文件。 这是我的Java片段,它试图读取文件 这是此文件中的2行。第一行没有被正确解析,并且在处被拆分,因为我猜是转义双引号。

  • 问题内容: 我有一个CSV文件,其中存在一些引用问题: SuperCSV使这些蠕虫(双关语)感到窒息。我知道应该应该是,但事实并非如此。LibreOffice实际上正确解析了这一点(这让我感到惊讶)。我当时只是想编写自己的小解析器,但是其他行在字符串中都带有逗号: 有人知道Java库会处理这种疯狂的东西吗?还是我应该尝试所有可用的?还是我最好自己解决这个问题? 问题答案: 正确的解决方案是找到生成

  • 样本数据- Header1,full_name,header3,header4 > 20,“Bob,XXX”,“Test”,30 20,“Evan”s,YYY“,”Test“,30 20,“Tom,ZZZ”,“Test”,30 第二行读起来不像预期的那样。因为full_name列值中有一个双引号。 我想忽略这类案件。任何建议都将不胜感激。 使用openCSV Java api进行解析。 编辑: 我

  • 问题内容: 我想使用程序包执行Windows命令,但是Windows进行了一些奇怪的转义。 我有类似的东西: “SomeText” 但这会引发错误,因为Windows会将其转换为 有人知道为什么吗?如何使用exec程序包在Windows上执行? 谢谢! 问题答案: OK,这是一个比较复杂一点比你预期,但有 是 一个解决方案: 不幸的是,尽管在2011年添加了对此功能的支持,但它似乎尚未纳入文档中。

  • 问题内容: 我有一个带WebMethod的asp.net页面,可将JSON传递回我的JavaScript。 贝娄是网络方法: 当它返回给客户端时,其格式如下: 问题在于双引号将所有内容都包装在’d’下。在web方法或其他不带引号的返回数据的方法中,我缺少什么吗?我真的不想每次都在客户端上删除它。我也看过其他的文章,这些文章是不会发生的。 任何帮助,将不胜感激谢谢。 问题答案: 我假设您想返回对象的

  • 我有如下数据 我正在尝试使用open csv解析csv,在我的csv中,名字可以包含双引号(MAL“COLMHS”)或带逗号的双引号(“SAGAR,TARLE”)或不带双引号的名字。 因此,使用. with IgnoreQuotations(true)我可以解析第一行(MAL"COLMHS),但无法找到解析第二行的解决方案。 我尝试了多个StackOverflow链接的解决方案,但无法解决它们。