Как обогатить данные содержимого csv дополнительными полями и преобразовать в текстовый файл с каналом в качестве разделителя с помощью apache camel

У меня есть файл csv с входным содержимым, разделенным запятой ",". Я хочу преобразовать это в текстовый файл с "|" разделитель. Я использую apache camel CsvDataFormat для преобразования заданного формата данных csv. Я могу преобразовать содержимое csv в строку с разделителями каналов. У меня есть еще две константы, которые я присвоил двум переменным. Я хотел бы обогатить содержимое выходных данных двумя дополнительными полями, как показано в ожидаемом результате.

Ввод

test.csv

Jack Dalton, 115, mad at Averell 
Joe Dalton, 105, calming Joe 
William Dalton, 105, keeping Joe from killing 
Averell Averell Dalton, 80, playing with Rantanplan 
Lucky Luke, 120, capturing the Daltons

Test.java

public class Test{
    private String name = "Hell0";
    private String address = "134 johen rd";
}

ConverterRoute.java

public class ConverterRoute implements RoutesBuilder {

    private static final String SOURCE_INPUT_PATH = "file://inbox?fileName=test.csv";

    private static final String SOURCE_OUTPUT_PATH = "file://outbox?fileName=file.txt";

    public void addRoutesToCamelContext(CamelContext context) throws Exception {

        context.addRoutes(new RouteBuilder() {
            public void configure() {
                try {
                    CsvDataFormat csvDataFormat = new CsvDataFormat();
                    csvDataFormat.setDelimiter('|');
                    csvDataFormat.setHeaderDisabled(true);

                    from(SOURCE_INPUT_PATH).
                            unmarshal().csv().
                            marshal(csvDataFormat).
                            to(SOURCE_OUTPUT_PATH)
                            .end();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

Вывод

файл.txt

Jack Dalton| 115 | mad at Averell 
Joe Dalton| 105 | calming Joe
William Dalton | 105 | keeping Joe from killing
Averell Averell Dalton| 80| playing with Rantanplan
Lucky Luke| 120| capturing the Daltons

Ожидаемый результат

файл.txt

Jack Dalton| 115 | mad at Averell | Hell0 | 134 johen rd
Joe Dalton| 105 | calming Joe | Hell0 | 134 johen rd
William Dalton | 105 | keeping Joe from killing | Hell0 | 134 johen rd
Averell Averell Dalton| 80| playing with Rantanplan | Hell0 | 134 johen rd
Lucky Luke| 120| capturing the Daltons | Hell0 | 134 johen rd

В приведенном выше выходном файле .txt последние два столбца — это две константы, которые у меня есть в моем классе Test.java pojo. Я хотел бы обогатить свои поля pojo конечным результатом. Есть ли способ добиться результата.


person TechGeek    schedule 14.03.2020    source источник


Ответы (1)


В вашем маршруте после шага

unmarshal().csv()

вы получили List<List<String>> в качестве тела сообщения. Каждая запись внешнего списка представляет собой строку CSV, а каждый внутренний список содержит значения строки.

Что вы хотите сделать, так это добавить два значения в каждый внутренний список.

Поскольку ваши значения одинаковы для каждой «строки», вероятно, наиболее простым подходом является написание простого Java-бина, который принимает List<List<String>>, выполняет итерацию по внешнему списку и добавляет два значения (записи списка) к каждому внутреннему списку.

в вашем маршруте Camel вы называете этот компонент с помощью

.bean(YourBean.class, "methodname")

но methodname нужен только тогда, когда Bean имеет несколько методов.

И тогда ваш маршрут продолжается с

.marshal(csvDataFormat)
.to(SOURCE_OUTPUT_PATH)

Это должно сгенерировать файл, который вы хотите.

Кстати, .end() в конце маршрута не нужен.

person burki    schedule 27.03.2020