Анализатор CSV в JAVA, двойные кавычки в строке (SuperCSV, OpenCSV)

Весь день я искал, как решить эту проблему и ничего... Я хочу написать функцию, которая конвертирует файл CSV в коллекцию списков (строк). Вот эта функция:

public Collection<? extends List<String>> parse() throws IOException {
    Collection<List<String>> collectionOfLists = new ArrayList<List<String>>();
    CsvListReader parser = new CsvListReader(Files.newBufferedReader(pathToFile, StandardCharsets.UTF_8), CsvPreference.EXCEL_PREFERENCE);

    List<String> row;
    while( (row = parser.read()) != null)
        collectionOfLists.add(row);

    return collectionOfLists;
}

public static String toString(Collection<? extends List<String>> csv) {
    StringBuilder builder = new StringBuilder();
    for(List<String> l : csv) {
        for(String s : l)
            builder.append(s).append(',');
        if(builder.length() > 0)
            builder.setCharAt(builder.length()-1,'\n');
    }
    return builder.toString();
}

Но, например, для этого ввода:

id, name, city, age
1,"Bob",London,12

Выходные данные для toString (parse ()):

id, name, city, age
1,Bob,London,12 

вместо того же, что и input: / Что я могу сделать, чтобы строки содержали \" (кавычки)? Пожалуйста, помогите мне.

3 ответа

Из твоего вопроса не понятно, спрашиваешь ли ты....

1. Мои данные содержат кавычки - почему их удаляют?

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

Так должно быть

1,""Bob"",London,12

не

1,"Bob",London,12

2. Как применять кавычки при написании (даже если данные не содержат запятых, кавычек и т. Д.)?

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

Если вы действительно хотите включить кавычки, то вы можете настроить Super CSV с режимом кавычек.

Например, вы всегда можете заключить в столбец имя в вашем примере следующие параметры:

private static final CsvPreference ALWAYS_QUOTE_NAME_COL = 
    new CsvPreference.Builder(CsvPreference.STANDARD_PREFERENCE)
    .useQuoteMode(new ColumnQuoteMode(2)).build();

В качестве альтернативы, если вы хотите процитировать все, то вы можете использовать AlwaysQuoteModeили, если вы хотите полностью индивидуальное решение, вы можете написать свое собственное QuoteMode,

Вы создаете свои собственные предпочтения.

CsvPreference excelPreference = new CsvPreference.Builder('\'', ',', "\n").build();
CsvListReader parser = new CsvListReader(Files.newBufferedReader(pathToFile , StandardCharsets.UTF_8), excelPreference);

После этого он будет выводиться как положено. В этом примере вы удалите одиночную кавычку, если она есть в вашем CSV-файле, и оставите двойную кавычку без изменений.

В CsvPreference.EXCEL_PREFERENCE Вы дали, символ кавычки является " как описано в Javadoc. Символ кавычки - это символ, который вы используете для переноса специальных символов, которые вы хотите, чтобы вы буквально отображались.

Таким образом, для этих предпочтений подходящим способом для создания вашего контента CSV будет

id, name, city, age
1,"""Bob""",London,12

Иначе парсер CSV просто думает

"Bob"

означает, буквально,

Bob

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

В качестве альтернативы, предоставьте другой CsvPreference объект, который имеет другой символ кавычки.

Принимайте это решение только после того, как будете уверены в том, что отправляет вам ваш продюсер CSV.

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