Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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 OpenCSV未转义引号(";)_Java_Regex_Csv_Opencsv - Fatal编程技术网

Java OpenCSV未转义引号(";)

Java OpenCSV未转义引号(";),java,regex,csv,opencsv,Java,Regex,Csv,Opencsv,我有一个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 FileInputStrea

我有一个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 opencsv 3.4

来自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);
    }


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

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

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

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

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

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

参考资料:

很抱歉,我没有足够的代表添加评论,因此我必须添加答案

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


对于CSV数据,分隔符前后的引号是字段数据的开始和结束,因此被删除。这就是为什么这两条引文不见了

您正在使用哪个OpenCSV?com.opencsv:opencsv/au.com.bytecode:opencsv/net.sf.opencsv:opencsv?@RemigiusStalder:如果我把quotechar和escape都放在“\”,那么我会遇到一个例外,这两个都不能用反斜杠表示,就像CSVReader reader=new CSVReader(isr,“\”,“\”,“\”);如果我理解正确,您已经提到了您得到的处理结果。但是你想要达到什么样的结果呢?相同的拆分,但带有您和|之间的引号?还是不同的分裂?老实说,这看起来像是CSVParser中的一个bug,因为它应该将引号视为字段分隔符,或者让它们保持原样,这对于您和|之间被吞没的引号来说都不是这样。我已经将缺少的引号分离为两个简单的情况:1:[“I”y“| h”]和2:[“I”y“| h”](方括号应该被删除)。第二个是在I之后没有空格的,奇怪的是,它甚至吞没了y的两个引号。这些角落案例中的每一个都应该imho(使用默认参数的当前解释)解析为与输入行相同的单个字段。