当前位置: 首页 > 知识库问答 >
问题:

使用CSV解析器解析CSV文件时忽略字段中的双引号

潘宸
2023-03-14

样本数据-

Header1,full_name,header3,header4

>

  • 20,“Bob,XXX”,“Test”,30
  • 20,“Evan”s,YYY“,”Test“,30
  • 20,“Tom,ZZZ”,“Test”,30

    CSVReader csvReader = new CSVReader(reader, ',', '"');
    

    第二行读起来不像预期的那样。因为full_name列值中有一个双引号。

    我想忽略这类案件。任何建议都将不胜感激。

    使用openCSV Java api进行解析。

    编辑:

    我正在从数据库中获取数据。其中一个数据库列字段的值中有一个双引号。因此,csv数据看起来格式不正确。

  • 共有1个答案

    段干安和
    2023-03-14

    Univocity解析器可以处理未转义的引号,速度也比OpenCSV快4倍。请尝试以下代码:

    public static void main(String... args){
        String input = "" +
                "20, \"bob, XXX\", \"test\", 30\n" +
                "20, \"evan\"s,YYY \", \"test\", 30\n" +
                "20, \"Tom, ZZZ\", \"test\", 30 ";
    
    
        CsvParserSettings settings = new CsvParserSettings();
    
        CsvParser parser = new CsvParser(settings);
        List<String[]> rows = parser.parseAll(new StringReader(input));
    
        //printing values enclosed in [ ]  to make sure you are getting the expected result
        for(String[] row : rows){
            for(String value : row){
                System.out.print("[" + value + "],");
    
            }
            System.out.println();
        }
    }
    

    这将产生:

    [20],[bob, XXX],[test],[30],
    [20],["evan"s],[YYY "],[test],[30],
    [20],[Tom, ZZZ],[test],[30],
    

    此外,您还可以通过以下操作之一控制如何处理未转义引号:

    settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.STOP_AT_DELIMITER);
    settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.STOP_AT_CLOSING_QUOTE);
    settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.RAISE_ERROR);
    settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.SKIP_VALUE);
    

    读取大文件时,可以使用rowprocessor或像这样遍历每一行:

    parser.beginParsing(new File("/path/to/your.csv"));
    
    String[] row;
    while ((row = parser.parseNext()) != null) {
        // process row
    }
    

    免责声明:我是这个图书馆的作者。它是开源和免费的(Apache 2.0许可证)

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

    • 问题内容: 使用nodejs,我想解析一个包含10000条记录的.csv文件,并对每一行进行一些操作。我尝试使用http://www.adaltas.com/projects/node- csv 。我无法让它在每一行暂停。这只会读取所有10000条记录。我需要执行以下操作: 逐行读取csv 在每条线上执行耗时的操作 转到下一行 有人可以在这里提出其他建议吗? 问题答案: 好像您需要使用一些基于流的

    • 使用nodejs,我想解析一个包含10000条记录的.csv文件,并对每一行执行一些操作。我尝试使用http://www.adaltas.com/projects/node-csv。我不能让它每排都停下来。这只是读取所有的10000个记录。我需要做到以下几点: 逐行读取csv 对每行执行耗时操作 转到下一行

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

    • 我有一个需要使用CSVREAD导入的csv文件。问题是它以不同的方式具有日期时间格式,因此需要解析it.Can有人给我一个我应该如何做的例子吗? 我尝试:合并到消息(MESG_DATE_FROMMESG_DATE_TOMESG_DISPLAY_SEQMESG_TIME_DELAYMESG_IDREASONTYPE_MAJOR)选择*from CSVREAD('MESSAGE_0.csv'); 这些

    • 问题内容: 我正在使用Commons CSV来解析与电视节目有关的CSV内容。其中一个节目的节目名称带有双引号; 2010年9月10日116,6,2,29,“” JJ“(60分钟)”,“ http://www.tvmaze.com/episodes/4855/criminal- minds-6x02-jj ” 节目名称为“ JJ”(60分钟),该名称已用双引号引起来。这在封装的令牌和定界符之间抛出