如何根据自定义分隔符拆分
How To Split Based On a Custom Delimiter
我正在使用 spring 集成,想知道如何覆盖 @Splitter
组件的默认分隔符。我专门使用 FileSplitter
组件。我的目标是通过入站文件适配器接收逗号分隔的文件,并使用逗号作为分隔符拆分该文件。如果我错了请纠正我,但 @Splitter
组件默认根据 '\n'
拆分文件。以下是我目前的代码。
@Bean
@InboundChannelAdapter(value = "fileAdapterInCh" , poller = @Poller(fixedDelay = "1000"))
public MessageSource<File> fileReadingMessageSource() {
log.info("Got a message from channel 'httpInputRequestCh' in fileReadingMessageSource");
FileReadingMessageSource source = new FileReadingMessageSource();
source.setAutoCreateDirectory(true);
source.setDirectory(new File(inputFilePath));
ChainFileListFilter<File> cflf = new ChainFileListFilter<>();
cflf.addFilter(new LastModifiedFileListFilter(30));
cflf.addFilter(new AcceptOnceFileListFilter<>());
cflf.addFilter(new SimplePatternFileListFilter(fileExtention));
source.setFilter(cflf);
List<File> files = source.getScanner().listFiles(new File(inputFilePath));
source.start();
log.info("Listing all files found in '" + inputFilePath + "': " + files );
return source;
}
@Bean
@Splitter(inputChannel = "fileAdapterInCh" )
public FileSplitter fileSplitter() {
log.info("file adapter file splitter " );
FileSplitter fs = new FileSplitter();
fs.setOutputChannelName("testing1");
return fs;
}
编辑:
我是否应该使用 FileToStringTransformer
将 CSV 文件的内容转换为字符串,然后使用 DefaultMessageSplitter
组件,因为 class 有设置分隔符的方法?
FileSplitter
的重点是流式的逐行读取文件。
既然你说你的文件是带有这些逗号的单行,那么我们对 FileSplitter
各自无能为力。因为这就是 BufferedReader
的工作方式。
您可能会考虑不使用 FileSplitter
,而是将整个文件(而不是行)读入内存,然后使用带有逗号的 DefaultMessageSplitter
作为其 delimiter
选项:
/**
* Set delimiters to use for tokenizing String values. The default is
* <code>null</code> indicating that no tokenization should occur. If
* delimiters are provided, they will be applied to any String payload.
*
* @param delimiters The delimiters.
*/
public void setDelimiters(String delimiters)
我正在使用 spring 集成,想知道如何覆盖 @Splitter
组件的默认分隔符。我专门使用 FileSplitter
组件。我的目标是通过入站文件适配器接收逗号分隔的文件,并使用逗号作为分隔符拆分该文件。如果我错了请纠正我,但 @Splitter
组件默认根据 '\n'
拆分文件。以下是我目前的代码。
@Bean
@InboundChannelAdapter(value = "fileAdapterInCh" , poller = @Poller(fixedDelay = "1000"))
public MessageSource<File> fileReadingMessageSource() {
log.info("Got a message from channel 'httpInputRequestCh' in fileReadingMessageSource");
FileReadingMessageSource source = new FileReadingMessageSource();
source.setAutoCreateDirectory(true);
source.setDirectory(new File(inputFilePath));
ChainFileListFilter<File> cflf = new ChainFileListFilter<>();
cflf.addFilter(new LastModifiedFileListFilter(30));
cflf.addFilter(new AcceptOnceFileListFilter<>());
cflf.addFilter(new SimplePatternFileListFilter(fileExtention));
source.setFilter(cflf);
List<File> files = source.getScanner().listFiles(new File(inputFilePath));
source.start();
log.info("Listing all files found in '" + inputFilePath + "': " + files );
return source;
}
@Bean
@Splitter(inputChannel = "fileAdapterInCh" )
public FileSplitter fileSplitter() {
log.info("file adapter file splitter " );
FileSplitter fs = new FileSplitter();
fs.setOutputChannelName("testing1");
return fs;
}
编辑:
我是否应该使用 FileToStringTransformer
将 CSV 文件的内容转换为字符串,然后使用 DefaultMessageSplitter
组件,因为 class 有设置分隔符的方法?
FileSplitter
的重点是流式的逐行读取文件。
既然你说你的文件是带有这些逗号的单行,那么我们对 FileSplitter
各自无能为力。因为这就是 BufferedReader
的工作方式。
您可能会考虑不使用 FileSplitter
,而是将整个文件(而不是行)读入内存,然后使用带有逗号的 DefaultMessageSplitter
作为其 delimiter
选项:
/**
* Set delimiters to use for tokenizing String values. The default is
* <code>null</code> indicating that no tokenization should occur. If
* delimiters are provided, they will be applied to any String payload.
*
* @param delimiters The delimiters.
*/
public void setDelimiters(String delimiters)