我正在嘗試使用 a 通過 spring-batch 讀取 ATM-EJ 檔案flatFileItemReader
,它完美地讀取了所有內容,除了它錯過了以 # 開頭的任何行。下面是我的itemReder
@Bean
@Scope(value = "step", proxyMode = ScopedProxyMode.TARGET_CLASS)
public FlatFileItemReader flatFileItemReader(@Value("#{jobParameters}") Map<String, JobParameter> jobParameters) {
return new FlatFileItemReaderBuilder<FieldSet>()
.name("flatFileItemReader")
.resource(new PathResource(ProducerUtil.getJobParameterByName(jobParameters, ProducerConstants.MULTILINE_JOB_PARAM_NAME, "inputFilePath")))
//.lineTokenizer(ejFileTokenizer(null))
.lineTokenizer(initiateNewTokenizer())
.fieldSetMapper(new PassThroughFieldSetMapper())
.linesToSkip(Integer.parseInt(ProducerUtil.getJobParameterByName(jobParameters, ProducerConstants.MULTILINE_JOB_PARAM_NAME, "linesToSkip")))
.encoding("Cp1252")
//.encoding("UTF-8")
.build();
}
行分詞器
private LineTokenizer initiateNewTokenizer() {
return new AbstractLineTokenizer() {
@Override
protected List<String> doTokenize(String line) {
return Arrays.asList(line);
}
};
}
樣本輸入
*TRANSACTION START*
[020t CARD INSERTED
[020tCARD: ****************9847
DATE 29-12-20 TIME 00:04:34
00:04:36 ATR RECEIVED T=0
[020t 00:04:53 PIN ENTERED
[020t 00:04:59 OPCODE = A C C B
00:04:59 GENAC 1 : ARQC
EXTERNAL AUTHENTICATE: NO ARPC
00:05:02 GENAC 2 : AAC
00:05:09 ATR RECEIVED T=0
[020t 00:05:11 OPCODE = A C C B
00:05:11 GENAC 1 : ARQC
00:05:14 GENAC 2 : TC
[020t 00:05:20 NOTES STACKED
[020t 00:05:25 CARD TAKEN
[020t 00:05:28 NOTES PRESENTED 0,1,0,0
#29/12/20 00:06 ATM0001
000607934460 1351 29/12/20
XXXXXXXXXXXXXXXXX
CUR100.00 CashWithdrawal 000
[020t 00:05:29 NOTES TAKEN
[000p[040q(1 *1351*1*E*000010000,M-00,R-10100
[020t 00:05:36 TRANSACTION END
這是未被讀取的行
#29/12/20 00:06 ATM0001
我不確定是什么問題,這可能是編碼嗎?或與標記器有關?我嘗試除錯,發現下面的方法沒有收到以 # 開頭的行
@Override
protected List<String> doTokenize(String line) {
uj5u.com熱心網友回復:
“ # ”是一個注釋FlatFileItemReader
,這就是為什么您沒有收到該行。
FlatFileItemReader源代碼包含以下內容:
public static final String[] DEFAULT_COMMENT_PREFIXES = new String[] { "#" };
因此,如果您想在構建器中指定不同的注釋前綴:
.comments("")
在您的代碼中:
return new FlatFileItemReaderBuilder<FieldSet>()
.name("flatFileItemReader")
.resource(new PathResource(ProducerUtil.getJobParameterByName(jobParameters, ProducerConstants.MULTILINE_JOB_PARAM_NAME, "inputFilePath")))
//.lineTokenizer(ejFileTokenizer(null))
.lineTokenizer(initiateNewTokenizer())
.fieldSetMapper(new PassThroughFieldSetMapper())
.linesToSkip(Integer.parseInt(ProducerUtil.getJobParameterByName(jobParameters, ProducerConstants.MULTILINE_JOB_PARAM_NAME, "linesToSkip")))
.encoding("Cp1252")
//.encoding("UTF-8")
.comments("") // ignore lines that starts with
.build();
參考:https ://github.com/spring-projects/spring-batch/blob/c4b001b732c8a4127e6a2a99e2fd00fff510f629/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/FlatFileItemReader.java
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/453701.html
下一篇:在kotlin中創建和寫入檔案