CSV Splitter

El CSV Splitter proporcionado por IPF permite dividir CSV archivo en componentes separados para utilizar en debulking.

Toma un tiempo bastante restricted component hierarchy configuration para definir la estructura del CSV archivo.

Maven Dependency

Para utilizar el CSV splitter, se debe proporcionar la siguiente dependencia, con una versión que coincida con ipf-debulker-core para garantizar la compatibilidad.

<dependency>
    <groupId>com.iconsolutions.ipf.debulk</groupId>
    <artifactId>ipf-debulker-csv-splitter</artifactId>
    <version>${ipf-debulker-core.version}</version>
</dependency>

Component Hierarchy Configuración

A diferencia de la XML y Divisores JSON, el CSV splitter solo admite dividir un archivo en componentes raíz con un único hijo. Si la entrada CSV estructura características niveles de anidamiento (por ejemplo, basado en un campo de tipo de registro) entonces considere escribir un custom splitter que mantiene el tipo de registro actual como parte de su state.

Al configurar el componente raíz, el marker debe ser "header" o "none". Seleccionar "header" asigna el contenido de la primera línea del archivo al componente raíz, mientras que elegir "none" deja el componente raíz con contenido nulo.

El único permitido marker para el componente hijo (del cual solo se permite uno) es 'body'. Si la raíz se establece en "header", cada componente hijo contendrá las líneas subsiguientes del archivo. Cuando se establece en "none", los componentes hijos incluirán también la primera línea, asegurando la compatibilidad con CSV archivos que carecen de un encabezado.

Ejemplo de Uso

Imagine que queremos procesar grandes cantidades de CSV archivos que contienen datos sobre libros en una biblioteca y los dividen en registros individuales, para que puedan ser utilizados por algún sistema posterior.

El archivo de ejemplo es pequeño para fines de demostración, pero podría contener un gran número de líneas.

ejemplo.csv
Library,Author,Title,Chapter,Start Page
Library of Alexandria,"Martin, Robert", Clean Code,Clean Code,1
Library of Alexandria,"Martin, Robert", Clean Code,Meaningful Names,17
Library of Alexandria,"Bloch, Joshua", Effective Java,Introduction,1
Library of Alexandria,"Bloch, Joshua", Effective Java,Creating and Destroying Objects,5

Dado nuestro ejemplo CSV datos, podemos decidir dividirlo utilizando la siguiente jerarquía.

header
└── body

Con estos requisitos previos fuera del camino, escribamos el programa. Tenga en cuenta que este ejemplo utiliza Project Reactor para convertir el Java 9 Flow. Publisher a un Flux para hacer que la suscripción a los datos sea un poco más sencilla, pero esto podría ser reemplazado por otra biblioteca reactiva que sea compatible con el Java 9 bibliotecas reactivas, p. ej. RxJava.

ActorSystem system = ActorSystem.create();
Splitter splitter = new AkkaCsvSplitter(system);

InputStream stream = getClass().getClassLoader().getResourceAsStream("example.csv");

ComponentHierarchy root = ComponentHierarchy.root("header");
ComponentHierarchy body = root.addChild("body");

Flux<DebulkComponent> flux = splitter.split(stream, root);
List<DebulkComponent> components = flux.collectList().block();

components.forEach(System.out::println);

Ejecutar este código debería imprimir una serie de componentes extraídos en la consola.

salida
DebulkComponent(bulkId=null, id=, parentId=, marker=body, index=null, content=Library of Alexandria,"Martin, Robert", Clean Code,Clean Code,1)
DebulkComponent(bulkId=null, id=, parentId=, marker=body, index=null, content=Library of Alexandria,"Martin, Robert", Clean Code,Meaningful Names,17)
DebulkComponent(bulkId=null, id=, parentId=, marker=body, index=null, content=Library of Alexandria,"Bloch, Joshua", Effective Java,Introduction,1)
DebulkComponent(bulkId=null, id=, parentId=, marker=body, index=null, content=Library of Alexandria,"Bloch, Joshua", Effective Java,Creating and Destroying Objects,5)
DebulkComponent(bulkId=null, id=, parentId=null, marker=header, index=null, content=Library,Author,Title,Chapter,Start Page)