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

Есть ли способ проанализировать файл CSV (переменное число столбцов) с помощью какого-то синтаксического анализатора CSV (например, SuperCSV) для набора List без пропуска кавычек в 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, сделать что-то с этим и распечатать на стандартный вывод, оставив кавычки, где они были. Пожалуйста, помогите мне.

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]

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

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

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

Другие вопросы по тегам