Альтернативой может быть создание класса, подобного ClassifierCompositeItemProcessor
или ClassifierCompositeItemWriter
. То есть требуется Classifier
, список делегированных ItemReader
и выбрать правильный ItemReader
в зависимости от результата Classifier
.
Проблема в том, что у вас нет ввода для классификации, поскольку чтение еще не завершено. Вот почему я думал об использовании свойства resource
как элемента для классификации. Вот результат:
public class ResourceClassifierCompositeItemReader<T> implements ItemReader<T> {
private Classifier<String, ItemReader<? extends T>> classifier = new ClassifierSupport<String, ItemReader<? extends T>> (null);
private Resource resource;
public void setClassifier(Classifier<String, ItemReader<? extends T>> classifier) {
this.classifier = classifier;
}
@Override
public T read() throws Exception, UnexpectedInputException, ParseException {
return readItem(classifier.classify(resource.getFilename()));
}
private T readItem(ItemReader<? extends T> reader) throws Exception {
return reader.read();
}
public void setResource(Resource resource) {
this.resource = resource;
}
}
Теперь о том, как его использовать. Сначала вам понадобится MultiResourceItemReader
, чтобы одновременно читать как .PSV, так и .CSV. Затем вам придется делегировать чтение на ResourceClassifierCompositeItemReader
. Вам нужно будет добавить BackToBackPatternClassifier
, чтобы классифицировать String resource.getFilename()
(то есть имя файла) и вызвать ItemReader
соответственно (через MatcherMap
). Для этого вам нужно написать свой собственный RouterDelegate
(взяв имя файла, разбить его, чтобы получить расширение, и вернуть его как строку, которую нужно сопоставить).
решения создать свой собственный читатель и применить соответствующую логику, основанную на расширение файла –
Проверки HTTP: // stackoverflow.com/questions/33777596/parsing-several-csv-files –