Есть ли функция Spring, которая удаляет символ кавычки или разделитель в файле CSV? - PullRequest
0 голосов
/ 06 мая 2020

Я читаю файл с миллионами записей в Spring, где поля заключены в кавычки с символом ", а разделителем является символ |.

Пример:

"name1" | "name2" | "na" me3 "|" name4 "| ....

Я использую:

DelimitedLineTokenizer.setQuoteCharacter('"')

, чтобы удалить символы двойных кавычек , но двойные кавычки в поле name3 обрабатываются неправильно.

Проблема - результаты:

Obj.name1 = name1 
Obj.name2= name2
Obj.name3 = name3|name4 
Obj.name4 = null

1 Ответ

2 голосов
/ 06 мая 2020

Согласно CSV RF C, раздел 2.7, ваш файл CSV недействителен. Вот выдержка из спецификации:

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

Если вы избежите ", как указано в RF C, Spring Batch правильно токенизирует строку, вот быстрый (проходной) тест с v4.2.2:

@Test
public void testSo61636078() {
    DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
    tokenizer.setDelimiter("|");
    tokenizer.setQuoteCharacter('"');
    FieldSet fieldSet = tokenizer.tokenize("\"name1\"|\"name2\"|\"na\"\"me3\"|\"name4\"");
    assertEquals(4, fieldSet.getFieldCount());
    assertEquals("name1", fieldSet.readString(0));
    assertEquals("name2", fieldSet.readString(1));
    assertEquals("na\"me3", fieldSet.readString(2));
    assertEquals("name4", fieldSet.readString(3));
}
...