SuperCSV цитирует каждую экспортированную ячейку

Я использую superCSV для экспорта данных bean-компонентов в CSV. Я бы хотел, чтобы каждая ячейка была заключена в двойные кавычки, а не только со специальными символами.

Теперь, используя CsvPreference.EXCEL_NORTH_EUROPE_PREFERENCE, даже ячейки со специальными символами не будут заключаться в кавычки. (При настройке EXCEL_PREFERENCE адреса, содержащие '.', заключаются в кавычки.)

Моя цель - экспортировать адреса, номера телефонов, все таким образом, чтобы MS Office (венгерский) мог использовать и, т. е. не преобразовывал телефонные номера, такие как +36000000000, в 36000000000.


person csaadaam    schedule 16.04.2012    source источник
comment
Я разработчик Super CSV. Я посмотрю на это, когда вернусь с работы сегодня вечером, и вернусь к вам. Должна быть возможность обойти это, но это похоже на функцию, которую мы должны добавить.   -  person James Bassett    schedule 17.04.2012
comment
Это лучшее решение, которое я нашел до сих пор sourceforge.net/projects /supercsv/forums/forum/718794/topic/   -  person csaadaam    schedule 17.04.2012
comment
К вашему сведению, Super CSV 2.0.0-beta-1 уже вышла. Он включает в себя множество исправлений ошибок и новых функций (включая поддержку Maven и новое расширение Dozer для сопоставления вложенных свойств и массивов/коллекций).   -  person James Bassett    schedule 18.09.2012


Ответы (1)


Изменить: обновление для Super CSV 2.1.0

Начиная с Super CSV 2.1.0, теперь вы можете указать QuoteMode в настройках, чтобы включить кавычки, когда они обычно не требуются. Чтобы процитировать каждый столбец, вы можете использовать встроенный AlwaysQuoteMode. Если вы хотите включить кавычки для определенных столбцов, используйте функцию ColumnQuoteMode. Обратите внимание, что вы не можете отключить цитирование таким образом, вам нужно будет указать свой собственный CsvEncoder, чтобы сделать это.


Спасибо, что обратили мое внимание на сообщение на форуме! Похоже, Каспер не удосужился реализовать эту функцию. Я посмотрю, что я могу сделать для предстоящего выпуска :)

Вместо того, чтобы взламывать исходный код Super CSV, чтобы добавить эту функцию «цитировать все», вы можете расширить реализацию Super CSV в своем собственном проекте. Как вы упомянули, Super CSV заключает в кавычки все поле, только если оно содержит специальные символы (кавычки, запятую и т. д.), а также делает это, если поле содержит начальные/конечные пробелы.

Имея это в виду, нет никаких причин, по которым вы не можете написать свой собственный Writer, который переопределяет метод escapeString() (вам просто нужно убедиться, что он еще не заключен в кавычки).

package org.supercsv.io;

import java.io.Writer;

import org.supercsv.prefs.CsvPreference;

public class QuoteAllCsvBeanWriter extends CsvBeanWriter {

    public QuoteAllCsvBeanWriter(Writer writer, CsvPreference preference) {
        super(writer, preference);
    }

    @Override
    protected String escapeString(String csvElement) {

        // perform normal escaping
        final String escaped = super.escapeString(csvElement);

        // add surrounding quotes if required
        final String quote = String.valueOf((char) preference.getQuoteChar());
        if (escaped.startsWith(quote) && escaped.endsWith(quote)){
            return escaped;
        } else {
            return quote + escaped + quote;
        }
    }

}
person James Bassett    schedule 17.04.2012
comment
Пришел почти к такому же решению, но ваше мне больше нравится :) (я проверял, только если оно начинается с кавычки, и я использую CsvMapWriter). - person csaadaam; 17.04.2012
comment
Это, вероятно, излишество, вы правы, так как последний символ должен быть кавычкой, если первый! - person James Bassett; 17.04.2012
comment
@HoundDog, когда выйдет новая версия SuperCSV? Прошло 4 года с момента последнего релиза, а в 1.52 так много причуд/ошибок. Глядя на активность SCM, я вижу только 5 коммитов в этом году — стоит ли считать проект мертвым? - person MRalwasser; 24.05.2012
comment
@MRalwasser Нет, он очень живой! Я просто выбился из сил на работе последние несколько месяцев. Я надеюсь выпустить релиз в июне. Извините за задержку. - person James Bassett; 24.05.2012