2017-01-05 2 views
0

Моим вариантом использования было преобразование Java POJO в String, чтобы оно могло быть передано для публикации в AWS Kinesis Firehose Stream.Как символ разделителя ESCAPE в библиотеке Jackson-dataformat-csv?

Я писал это convertToString(), но я не могу найти правильный способ избежать разделителя.

public <T> List<String> convertToString(List<T> objectList, Class<T> tClass) { 

     List<String> stringList = new ArrayList<>(); 
     char delimiter = ','; 
     char escape = '\\'; 

     CsvMapper mapper = new CsvMapper(); 
     CsvSchema schema = mapper.schemaFor(tClass); 

     for (T object : objectList) { 
      try{ 
       stringList.add(mapper.writer(schema.withColumnSeparator(delimiter).withEscapeChar(escape)) 
         .writeValueAsString(object)); 
      } catch (JsonProcessingException e) { 
       System.out.println("Exception : " + e); 
      } 
     } 

     return stringList; 
} 

Вход: SuperHero вспышка = новый SuperHero (1, "Flash", "Барри Аллен", "DC");

Ожидаемый результат: 1, Flash, "Барри \ Аллен", DC

выход я получаю: 1, Flash, "Барри Аллен", DC

Может кто-то указать, что Я поступаю неправильно?

ответ

1

Вывод правильный, в CSV, когда вы окружаете объект или элемент двойными кавычками, он записывается как есть, поэтому «Flash» записывается без кавычек, а «Barry, Allen» записывается с кавычками на выходе, поэтому разделитель уже экранирован и не нуждается в сбегании с обратной косой чертой.

EDIT/UPDATE

После прочтения документации, предоставленной на github, следующая строка показывает генератор использует только двойные кавычки, и побег используется только для разбора.

escapeChar (int) [default: -1 Значение "none"]: символ, если таковой имеется, используется для удаления значений. Наиболее часто определяется как обратная косая черта ('\'). Используется только парсером; генератор использует только цитирование, включая удвоение кавычек, чтобы указать сам кат.

+0

Я заинтересован в том, чтобы ускользнуть от моего разделителя в поле, поэтому его можно считать единственным полем. Есть ли способ достичь этого? – dushyantashu

+0

Он уже считается единственным полем. Если вы заметили, что на вашем выходе только «Барри, Аллен» имеет двойные кавычки, это означает, что это одно поле. Вы можете сохранить этот вывод в CSV-файл и открыть его в excel, чтобы увидеть результат, и вы обнаружите, что «Barry, Allen» - это одно поле, не отображающее двойные кавычки. Окружение поля с двойными кавычками ускоряет символы внутри, за исключением двойных кавычек, которые нужно только экранировать. –

+0

Для csv это работает, но разделитель AWS Kinesis должен быть экранирован для публикации в Redshift. Проверьте это: http://docs.aws.amazon.com/redshift/latest/dg/r_COPY_command_examples.html#r_COPY_command_examples-copy-data-with-the-escape-option, поэтому я искал обходной путь. – dushyantashu

Смежные вопросы