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 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


person BhajjiMaga    schedule 10.06.2015    source источник
comment
какой OpenCSV вы используете? com.opencsv:opencsv/au.com.байткод:opencsv/net.sf.opencsv:opencsv ?   -  person Remigius Stalder    schedule 10.06.2015
comment
@RemigiusStalder: Пожалуйста, посмотрите сейчас   -  person BhajjiMaga    schedule 11.06.2015


Ответы (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);
    }

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

Существует конструктор с дополнительным escape-параметром, который позволяет экранировать разделители и кавычки (согласно javadoc).

person Remigius Stalder    schedule 10.06.2015
comment
Хорошо, если я поставлю как кавычки, так и escape как '\', это даст мне исключение: оба не могут быть одинаковыми - person BhajjiMaga; 11.06.2015
comment
попробуйте сделать обратную косую черту, как в CSVReader reader = new CSVReader(isr, '|', '\', '\\'); - person Remigius Stalder; 11.06.2015
comment
Если я правильно понял, вы упомянули результат обработки, который вы получаете. Но какого результата вы хотите добиться? Те же разделения, но с кавычками между вами и |? Или разное расщепление? Честно говоря, это выглядит как ошибка в CSVParser, так как он должен либо рассматривать кавычки как разделитель полей, либо оставлять их как есть, что не относится к проглоченной кавычке между вами и |. - person Remigius Stalder; 11.06.2015
comment
Я выделил недостающую кавычку в двух простых случаях: 1: [I y|h] и 2: [Iy|h] (квадратные скобки нужно убрать). Второй только без пробела после I, что странно проглатывает даже обе кавычки вокруг y. Каждый из этих крайних случаев должен imho - с текущей интерпретацией параметров по умолчанию - анализировать одно единственное поле, идентичное строке ввода. - person Remigius Stalder; 11.06.2015

Поскольку формат 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

person BhajjiMaga    schedule 11.06.2015

Извините, но у меня недостаточно представителей, чтобы добавить комментарий, поэтому мне придется добавить ответ.

На ваш первоначальный вопрос о том, что случилось с цитатой после вас, ответ такой же, как и с цитатой перед я.

Для данных CSV кавычки непосредственно перед и после разделителя являются началом и концом данных поля и поэтому удаляются. Вот почему эти две цитаты отсутствуют.

person Scott Conway    schedule 12.06.2015

Вам нужно избежать кавычек, которые являются частью поля. Экранирующий символ по умолчанию — \

Если предположить, какие кавычки вы хотите экранировать, строка должна выглядеть так:

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