2016-04-27 4 views
2

Ich bin Umsetzung Multi-Line Aufzeichnungen Reader Lösung auf Basis von https://docs.spring.io/spring-batch/reference/html/patterns.html#multiLineRecordsMulti-Line Aufzeichnungen Reader (wenn Start prefix = Ende Präfix)

Ich habe folgende flache Datei:

HEA;0013100345;2007-02-15 
NCU;Smith;Peter;;T;20014539;F 
BAD;;Oak Street 31/A;;Small Town;00235;IL;US 
HEA;0013100345;2007-02-15 
NCU;Smith;Peter;;T;20014539;F 
HEA;0013100345;2007-02-15 

HEA (und optional NCU, BAD) muss in ein einzelnes Objekt konvertiert werden.
In meinem Fall habe ich jedoch keine "End" -Zeile, also "HEA" ist ein Anfang des neuen Elements und gleichzeitig das Ende des vorherigen.

Dank Dean Clark für den guten Vorschlag unten. Dies ist Java-Config der Lösung:

@Bean 
public FlatFileItemReader<FieldSet> readerFlat() { 
    FlatFileItemReader<FieldSet> reader = new FlatFileItemReader<>(); 
    reader.setResource(new ClassPathResource("multirecord.txt")); 
    reader.setLineMapper(compositeLineMapper()); 
    return reader; 
} 

@Bean 
public SingleItemPeekableItemReader<FieldSet> readerPeek() { 
    SingleItemPeekableItemReader<FieldSet> reader = new SingleItemPeekableItemReader<FieldSet>() {{ 
     setDelegate(readerFlat()); 
    }}; 
    return reader; 
} 

@Bean 
public MultiLineCaseItemReader readerMultirecord() { 
    MultiLineCaseItemReader multiReader = new MultiLineCaseItemReader() {{ 
     setDelegate(readerPeek()); 
    }}; 
    return multiReader; 
} 

dann in den benutzerdefinierten MultiLineCaseItemReader Ihre beide read() und peek() tun können

Antwort

3

als Referenz docs erwähnen, sollten Sie eine benutzerdefinierte Implementierung von ItemReader schaffen die FlatFileItemReader zu wickeln.

Genauer gesagt, möchten Sie möglicherweise SingleItemPeekableItemReader erweitern und FlatFileItemReader als Ihre Stellvertretung verwenden.

Sie würden peek() voraus zum nächsten Artikel. Wenn es Teil Ihrer current item ist, großartig, gehen Sie voran und erweitern Sie Ihren Artikel. Wenn es die nächste "Kopfzeile" ist, dann haben Sie den Artikel fertiggestellt und können den current item zurückgeben.

Dann beginnt der nächste read() in der Zeile, die Sie gerade gesehen haben, ohne Ihren Platz in der Datei zu verlieren oder die Neustartfähigkeit zu verkomplizieren.

+0

Danke Dean! Genau das habe ich gesucht. Wundern, warum Frühling Batch-Referenzführer hat nichts über SingleItemPeekableItemReader ... – mirrow

+1

Dean, würden Sie bitte den Satz ändern "Wenn es die nächste" Überschrift "Zeile ist, dann das Element, das Sie arbeiten." weil es klingt, als ob einige Wörter fehlen :) – anton1980