Java: анализатор CSV — пропуск кавычек

Есть ли способ проанализировать файл CSV (переменное количество столбцов) с помощью какого-либо анализатора CSV (например, SuperCSV) для набора List‹String› без пропуска кавычек в Java? Для ввода:

id,name,text,sth
1,"John","Text with 'c,o,m,m,a,s' and \"",qwerty
2,Bob,"",,sth

после разбора хотелось бы иметь в наборе тот же текст, что и на входе вместо:

id,name,text,sth
1,John,Text with 'c,o,m,m,a,s' and \",qwerty
2,Bob,null,null,sth

этот элемент

«Джон» будет проанализирован как строка «Джон» (вместо «Джон»)

"" --> ""

,, --> ,нуль,

и т.п.

Я уже писал об этом здесь, но Я, вероятно, не сделал это достаточно ясно. Я хочу разобрать CSV-файл на набор List‹String›, сделать что-то с этим и распечатать на стандартный вывод, оставив кавычки там, где они были. Помогите мне, пожалуйста.


person user3521479    schedule 11.04.2014    source источник
comment
возможный дубликат парсера CSV в JAVA, двойные кавычки в строке (СуперCSV, OpenCSV)   -  person Raedwald    schedule 11.04.2014
comment
Уточните исходный вопрос, а не задавайте его снова, но другими словами.   -  person Raedwald    schedule 11.04.2014


Ответы (2)


Что-то вроде этого? Не используя какой-либо существующий парсер, делая это с нуля:

public List<String> parse(String st) {

    List<String> result = new ArrayList<String>();

    boolean inText = false;
    StringBuilder token = new StringBuilder();
    char prevCh = 0;
    for (int i = 0; i < st.length(); i++) {
        char ch = st.charAt(i);
        if (ch == ',' && !inText) {
            result.add(token.toString());
            token = new StringBuilder();
            continue;
        }
        if (ch == '"' && inText) {
            if (prevCh == '\\') {
                token.deleteCharAt(token.length() - 1);
            } else {
                inText = false;                    
            }
        } else if (ch == '"' && !inText) {
                inText = true;
        }
        token.append(ch);
        prevCh = ch;
    }
    result.add(token.toString());
    return result;
}

затем

String st = "1,\"John\",\"Text with 'c,o,m,m,a,s' and \\\"\",qwerty";

List<String> result = parse(st);
System.out.println(result);

Распечатает:

[1, "John", "Text with 'c,o,m,m,a,s' and "", qwerty]
person Udo Klimaschewski    schedule 11.04.2014
comment
Молодец, но интересно, можно ли сделать то же самое с помощью какой-нибудь библиотеки типа SuperCSV или OpenCSV? Потому что нигде не нашел.. - person user3521479; 11.04.2014
comment
Не знаю, никогда не использовал внешнюю библиотеку для такой тривиальной задачи. - person Udo Klimaschewski; 11.04.2014

Я использовал этот: http://opencsv.sourceforge.net/

И я остался очень доволен результатами. У меня была куча по-разному организованных CSV-файлов (иногда забавно, какие вещи в наши дни люди называют CSV), и мне удалось настроить для них программу чтения. Однако я не думаю, что он будет генерировать запятые, но оставит пробелы там, где есть пустое поле. Поскольку вы можете получить всю строку в виде массива, вы можете выполнить итерацию и запятую между каждой итерацией.

Поищите настройки, там их куча, включая кавычки.

person Aleksandar Stojadinovic    schedule 11.04.2014