【问题标题】:OpenCSV not escaping the quotes(")OpenCSV 没有转义引号(“)
【发布时间】:2015-08-25 19:11:42
【问题描述】:

我有一个 CSV 文件,其中引号内有分隔符或未闭合的引号,我如何使 CSVReader 忽略引号内的引号和分隔符。 例如:

123|Bhajji|Maga|39|"I said Hey|" I am "5|'10."|"I a do "you"|get that"

这是文件的内容。

下面的程序读取 csv 文件。

@Test
public void readFromCsv() throws IOException {
    FileInputStream fis = new FileInputStream(
            "/home/netspurt/awesomefile.csv");
    InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
    CSVReader reader = new CSVReader(isr, '|', '\"');

    for (String[] row; (row = reader.readNext()) != null;) {
        System.out.println(Arrays.toString(row));
    }
    reader.close();
    isr.close();
    fis.close();
}

我得到了类似这样的 o/p。

[123, Bhajji, Maga, 39, I said Hey| I am "5|'10., I am an idiot do "you|get that]

you 之后引用了什么

编辑: Opencsv 依赖项 com.opencsv 打开csv 3.4

【问题讨论】:

  • 您使用的是哪个 OpenCSV? com.opencsv:opencsv / au.com.bytecode:opencsv / net.sf.opencsv:opencsv ?
  • @RemigiusStalder:请立即查看

标签: java regex csv opencsv


【解决方案1】:

来自com.opencsv的源代码:opencsv:

  /**
     * Constructs CSVReader.
     *
     * @param reader    the reader to an underlying CSV source.
     * @param separator the delimiter to use for separating entries
     * @param quotechar the character to use for quoted elements
     * @param escape    the character to use for escaping a separator or quote
     */

    public CSVReader(Reader reader, char separator,
                     char quotechar, char escape) {
        this(reader, separator, quotechar, escape, DEFAULT_SKIP_LINES, CSVParser.DEFAULT_STRICT_QUOTES);
    }

http://sourceforge.net/p/opencsv/source/ci/master/tree/src/main/java/com/opencsv/CSVReader.java

有一个带有附加参数转义的构造函数,它允许转义分隔符和引号(根据 javadoc)。

【讨论】:

  • 好吧,如果我将 quotechar 和 escape 都设置为 ' \" ' 它会给我一个例外,两者不能相同
  • 尝试使其成为反斜杠,如 CSVReader reader = new CSVReader(isr, '|', '\"', '\\');
  • 如果我理解正确,您提到了您得到的处理结果。但是你想要达到的结果是什么?相同的拆分,但在您和 | 之间使用引号?还是不同的分裂?老实说,这看起来像是 CSVParser 中的一个错误,因为它应该将引号视为字段分隔符或保持原样,这对于你和 | 之间的吞下引号都不是这种情况。
  • 我已将缺少的引用隔离为两个简单的情况:1:["I"y"|h"] 和 2:["I"y"|h"](方括号应该是删除)。第二个在 I 之后没有空格 - 它甚至奇怪地吞下了 y 周围的两个引号。这些极端情况中的每一个都应该恕我直言 - 使用默认参数的当前解释 - 解析为与输入行相同的单个字段。
【解决方案2】:

您需要转义属于该字段的引号。默认转义字符是 \

猜测你想要转义字符串的引号应该是什么样的

123|Bhajji|Maga|39|"I said \"Hey I am \"5'10. Do \"you\" get that?\""

【讨论】:

    【解决方案3】:

    由于 CSV 格式指定引号(“),如果它在一个字段中,我们需要在它前面加上另一个引号(”)。所以这解决了我的问题。

    123|Bhajji|Maga|39|"I said Hey|"" I am ""5|'10."|"I a do ""you""|get that"
    

    参考:https://www.ietf.org/rfc/rfc4180.txt

    【讨论】:

      【解决方案4】:

      抱歉,我没有足够的代表来添加评论,所以我必须添加一个答案。

      对于您最初的问题,即您之后的报价发生了什么,答案与 I 之前的报价发生了什么相同。

      对于 CSV 数据,分隔符前后的引号是字段数据的开始和结束,因此被删除。这就是为什么缺少这两个引号的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-21
        • 2010-12-21
        • 2020-01-27
        • 1970-01-01
        • 2015-08-19
        • 1970-01-01
        • 1970-01-01
        • 2013-08-09
        相关资源
        最近更新 更多