Camel csv splitter: разбор динамических заголовков

Я пишу сплиттер CSV на верблюде. Мои требования таковы:

  1. Первая строка будет заголовком.
  2. Заголовок не определен. Но может содержать любое количество атрибутов
  3. Мне нужно разбить файл, и каждый разбиение содержит карту атрибутов ключевого значения.

Пример csv1:

header1, header2, header3
value11, value12 , value13
value21, value22 , value23

Ожидаемые разделения:

{"header1":"value11", "header2": "value12", "header3": "value13"}, 
{"header1":"value21", "header2": "value22", "header3": "value23"}

Пример csv2:

header1, header2
value11, value12
value21, value22

Ожидаемые разделения:

{"header1":"value11", "header2": "value12"}, 
{"header1":"value21", "header2": "value22"}

Как я могу добиться этого на верблюде, используя Bindy или BeanIO?


person user3487839    schedule 15.05.2014    source источник
comment
Можете ли вы уточнить вариант использования для этого? Кажется, очень странный дизайн для интеграции   -  person Daniel    schedule 16.05.2014
comment
Это файлы csv, которые поставщики передают нам. Они содержат информацию о продуктах, которые поставщик будет продавать нам. Заголовки содержат информацию об атрибутах, которые предоставляет продавец: например, stock_size, sla, price, Discount, Offers. Требование состоит в том, чтобы заголовки не были фиксированными, а должны интерпретироваться для каждого поставщика. У нас есть механизм правил, который будет читать эти заголовки, а затем преобразовывать их в набор атрибутов, понятных нашей системе.   -  person user3487839    schedule 16.05.2014
comment
Использовать старый способ Java: написать класс Java-компонента, который анализирует ввод и генерирует вывод?   -  person Peter Keller    schedule 16.05.2014


Ответы (1)


Мы можем использовать следующий код.

byte[] bytes = exchange.getIn().getBody(byte[].class);
    InputStream inputStream = new ByteArrayInputStream(bytes);
    Reader in = new InputStreamReader(inputStream, "UTF-8");
    Iterable<CSVRecord> records = CSVFormat.EXCEL.withHeader().parse(in);
    for (CSVRecord csvRecord : records) {

        String header1= csvRecord.get("header1");
        String header2 = csvRecord.get("header2");

    // We can form json here

        System.out.println("header1 :"+header1);
        System.out.println("header2 :"+header2);

    }
person Sridhar    schedule 20.07.2016