Apache Camel (second volet) : transformation des données d'un fichier texte Transformation de données avec Apache Camel : explication pas à pas

Apache Camel est plutôt bien outillé pour réaliser des transformations de données. Après un petit tour dans la documentation, je peux faire en sorte que Camel convertisse les lignes. Dans mon exemple, le fichier test.csv contient des valeurs séparées par des virgules :

nexistepas,com,2020-01-03,OWN-3121-4959
nomdomaine,fr,2013-11-14,OWN-4242-4431


Je modifie ma route pour insérer la conversion de chaque ligne en une liste de valeurs correspondant à chacune des colonnes :

 from("file:/tmp/csv?noop=true&fileName=test.csv")
.split(body().tokenize("\n"))
.log("ligne: $")
.unmarshal().csv()
.log("colonnes: $")
.end();


L'exécution de cette route avec le fichier de test donne comme résultat dans les logs :


21,737 INFO route1(212): ligne: nexistepas,com,2020-01-01,OWN-3121-4999
21,745 INFO route1(212): colonnes: [nexistepas, com, 2020-01-01, OWN-3121-4999]
21,746 INFO route1(212): ligne: nomdomaine,fr,2013-10-11,OWN-4413-4431
21,747 INFO route1(212): colonnes: [nomdomaine, fr, 2013-10-11, OWN-4413-4431]



On obtient bien une liste de String contenant les valeurs des colonnes. Il ne reste plus qu'à ajouter un bean de traitement qui utilise les valeurs. Par exemple :

 public class InportSimple
{
   Logger log = LoggerFactory.getLogger(InportSimple.class);

   public void importer(final List<String> colonnes)
   {
       for( final String colonne: colonnes) {
           this.log.info("c:" + colonne);
       }
   }
}



Comme le bean ne contient qu'une seule méthode et n'a besoin de rien d'autre qu'un Logger, il est possible de le créer directement. Dans des cas plus complexes, Camel sait injecter le bean depuis Spring par exemple. De même, il pourrait implémenter Processor, ce qui a l'avantage de donner l'accès à l'objet Exchange courant. Pour la mise en œuvre du bean, il faut modifier la route, qui devient :

 from("file:/tmp/csv?noop=true&fileName=test.csv")
.split(body().tokenize("\n"))
.log("ligne: $")
.unmarshal().csv()
.log("colonnes: $")
.bean(InportSimple.class)
.end();


La trace montre que l'on obtient bien le comportement attendu :


45,061 INFO route1(212): ligne: nexistepas,com,2020-01-01,OWN-3121-4999
45,067 INFO route1(212): colonnes: [nexistepas, com, 2020-01-01, OWN-3121-4999]
45,069 INFO InportSimple(27): c:nexistepas
45,069 INFO InportSimple(27): c:com
45,069 INFO InportSimple(27): c:2020-01-01
45,069 INFO InportSimple(27): c:OWN-3121-4999
45,071 INFO route1(212): ligne: nomdomaine,fr,2013-10-11,OWN-4413-4431
45,072 INFO route1(212): colonnes: [nomdomaine, fr, 2013-10-11, OWN-4413-4431]
45,073 INFO InportSimple(27): c:nomdomaine
45,073 INFO InportSimple(27): c:fr
45,073 INFO InportSimple(27): c:2013-10-11
45,073 INFO InportSimple(27): c:OWN-4413-4431