Как обогатить данные содержимого csv дополнительными полями и преобразовать их в текстовый файл с разделителем каналов, используя apache верблюд - PullRequest
0 голосов
/ 14 марта 2020

У меня есть CSV-файл с входным содержимым, разделенным запятой ",". Я хочу преобразовать это в текстовый файл с "|" разделитель. Я использую apache верблюд 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();
                }
            }
        });
    }
}

Выход

file.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

Ожидаемый вывод

file.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

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

1 Ответ

1 голос
/ 27 марта 2020

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

unmarshal().csv()

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

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

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

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

.bean(YourBean.class, "methodname")

, но methodname необходим только тогда, когда у компонента есть несколько методов.

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

.marshal(csvDataFormat)
.to(SOURCE_OUTPUT_PATH)

Это должно создать нужный файл.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...