如何获取 CSV 文件中的特定列
How To Get a Specific Column in a CSV File
我正在使用 Spring 集成,想知道如何通过入站文件适配器提取 CSV 文件并从文件中获取特定列。 CSV 文件结构如下所示。
Header1, Header2, Header3
Value, Value, Value
... ... ...
... ... ...
我需要的是从第二列 (Header2) 中提取所有值并读取每个值。
下面的代码。
@Bean
@SuppressWarnings("unchecked")
public IntegrationFlow fileIntegrationTesting() {
Gson gson = new GsonBuilder().disableHtmlEscaping().create();
return IntegrationFlows
.from(Files.inboundAdapter(new File(inputFilePath))
.filter(getFileFilters())
.autoCreateDirectory(true) ,
c -> c.poller(Pollers.fixedRate(1000))
)
.channel("fileInputChannel")
.transform(Files.toStringTransformer())
.split(s -> s.applySequence(true).delimiters(","))
.aggregate(a -> a.releaseStrategy(g -> g.size() >= 10)
.expireGroupsUponCompletion(true)
)
.handle((p, h) -> gson.toJson(new RequestPayload((Collection<String>) p)))
.enrichHeaders(eh -> eh.async(false)
.header("accept", "application/json")
.header("contentType", "application/json")
)
.handle(Http.outboundGateway("URL")
.httpMethod(HttpMethod.POST)
.expectedResponseType(String.class)
.extractPayload(true)
)
.get();
}
private FileListFilter<File> getFileFilters(){
ChainFileListFilter<File> cflf = new ChainFileListFilter<>();
cflf.addFilter(new LastModifiedFileListFilter(30));
cflf.addFilter(new AcceptOnceFileListFilter<>());
cflf.addFilter(new SimplePatternFileListFilter(fileExtention));
return cflf;
}
我认为您应该使用 FileSplitter
,而不是 FileToStringTransformer
,后者会将整个文件加载到一个字符串中。
然后,如果您要丢弃所有其他列,使用 .handle(myColumnSelector)
.
将是最有效的
有
@Component
public class MyColumnSelector {
@ServiceActivator
String getCol(String in) {
return StringUtils.delimitedListToStringArray(in)[1];
}
}
(为格式错误的行添加一些保护)。
我正在使用 Spring 集成,想知道如何通过入站文件适配器提取 CSV 文件并从文件中获取特定列。 CSV 文件结构如下所示。
Header1, Header2, Header3
Value, Value, Value
... ... ...
... ... ...
我需要的是从第二列 (Header2) 中提取所有值并读取每个值。
下面的代码。
@Bean
@SuppressWarnings("unchecked")
public IntegrationFlow fileIntegrationTesting() {
Gson gson = new GsonBuilder().disableHtmlEscaping().create();
return IntegrationFlows
.from(Files.inboundAdapter(new File(inputFilePath))
.filter(getFileFilters())
.autoCreateDirectory(true) ,
c -> c.poller(Pollers.fixedRate(1000))
)
.channel("fileInputChannel")
.transform(Files.toStringTransformer())
.split(s -> s.applySequence(true).delimiters(","))
.aggregate(a -> a.releaseStrategy(g -> g.size() >= 10)
.expireGroupsUponCompletion(true)
)
.handle((p, h) -> gson.toJson(new RequestPayload((Collection<String>) p)))
.enrichHeaders(eh -> eh.async(false)
.header("accept", "application/json")
.header("contentType", "application/json")
)
.handle(Http.outboundGateway("URL")
.httpMethod(HttpMethod.POST)
.expectedResponseType(String.class)
.extractPayload(true)
)
.get();
}
private FileListFilter<File> getFileFilters(){
ChainFileListFilter<File> cflf = new ChainFileListFilter<>();
cflf.addFilter(new LastModifiedFileListFilter(30));
cflf.addFilter(new AcceptOnceFileListFilter<>());
cflf.addFilter(new SimplePatternFileListFilter(fileExtention));
return cflf;
}
我认为您应该使用 FileSplitter
,而不是 FileToStringTransformer
,后者会将整个文件加载到一个字符串中。
然后,如果您要丢弃所有其他列,使用 .handle(myColumnSelector)
.
有
@Component
public class MyColumnSelector {
@ServiceActivator
String getCol(String in) {
return StringUtils.delimitedListToStringArray(in)[1];
}
}
(为格式错误的行添加一些保护)。