Java 从spring批处理程序的输入文件中删除所有行中的尾随空格
我有一个spring批处理程序,它从文件中读取数据并写入数据库 数据由| |(双管道)分隔,行尾并没有分隔符Java 从spring批处理程序的输入文件中删除所有行中的尾随空格,java,file,spaces,spring-batch,Java,File,Spaces,Spring Batch,我有一个spring批处理程序,它从文件中读取数据并写入数据库 数据由| |(双管道)分隔,行尾并没有分隔符 one||two||three||four foo||bar||foo1||bar1 问题是每行的结尾字符前有数百个尾随空格 使用ctrl+Q,文本板中的I显示: one||two||three||four....................................... foo||bar||foo1||bar1............... car||bike||tang
one||two||three||four
foo||bar||foo1||bar1
问题是每行的结尾字符前有数百个尾随空格
使用ctrl+Q,文本板中的I显示:
one||two||three||four.......................................
foo||bar||foo1||bar1...............
car||bike||tango||charlie..........................
这会在ItemReader(org.springframework.batch.item.file.FlatFileItemReader)中的每一行抛出解析错误
我不能手动删除空格,需要一些自动化操作,这样在spring批处理程序读取文件之前,空格就消失了
如何做到这一点
注意:只有在unix服务器上运行程序时,才会发生此错误。它不会发生在windows上
<beans:bean id="myBufferedReaderFactory" class="com.mypackage.MyBufferedReaderFactory"/>
<beans:bean id="FileToDBItemReader" class="org.springframework.batch.item.file.FlatFileItemReader">
<beans:property name="BufferedReaderFactory" ref="myBufferedReaderFactory"/>
<beans:property name="resource" ref="MyInputFileResource" />
<beans:property name="lineMapper">
<beans:bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<beans:property name="lineTokenizer">
<beans:bean class="com.mypackage.MyCustomLineTokenizer">
<beans:property name="delimiter" value="||"/>
<beans:property name="names" value="one,two,three,four" />
</beans:bean>
</beans:property>
<beans:property name="fieldSetMapper">
<beans:bean class="com.mypackage.MyFieldSetMapper" />
</beans:property>
</beans:bean>
</beans:property>
</beans:bean>
如何使用上述类中的InputStream对象删除尾随空格??
谢谢你的阅读 通过实现
BufferedReaderFactory
扩展BufferedReader
,并向读卡器添加行修剪功能。看
如果String.trim()
不可接受,则执行适当的行尾空格修剪。以下是代码:
BufferedReader reader = ....
String line = null;
while((line = reader.readLine()) != null) {
line = line.replaceAll("\\s*$");
// do what you need with the line
}
如果您有一些自动过程可以读取文件并将所有内容插入数据库,但无法修改该过程,请创建代码来读取文件并删除尾随空格(如上所示),并将修剪后的行写入其他文件。此其他文件可以作为DB导入过程的输入
顺便说一句,如果你正在使用linux,你可以说:
cat myfile.txt | sed's/*$/'>mytrimmedfile.txt
(在此语句中,您可能必须转义
*
)另一种解决方案。将配置中的DefaultLineMapper替换为以下自定义类DefaultTrimmingLineMapper
public class DefaultTrimmingLineMapper<T> extends DefaultLineMapper<T> {
/**
* Trims the line before passing it to the {@link DefaultLineMapper}.
*
* @see org.springframework.batch.item.file.mapping.DefaultLineMapper#mapLine(java.lang.String, int)
*/
@Override
public T mapLine(String line, int lineNumber) throws Exception {
return super.mapLine(line!=null?line.trim():null, lineNumber);
}
}
公共类DefaultTrimmingLineMapper扩展了DefaultLineMapper{
/**
*在将该行传递给{@link DefaultLineMapper}之前修剪该行。
*
*@see org.springframework.batch.item.file.mapping.DefaultLineMapper#mapLine(java.lang.String,int)
*/
@凌驾
公共T映射行(字符串行,整数行号)引发异常{
返回super.mapLine(line!=null?line.trim():null,lineNumber);
}
}
@Pratik:如前所述,我正在使用spring batch FlatFileItemReader类,它使用DefaultLineMapper映射行,使用LineTokenizer创建映射到文件列名的标记!!我不知道这个,但是如果你把代码贴在这里,那么其他的问题就很容易解决了,你能不能再详细一点!!现在,请你核对一下这个问题好吗。添加了与BufferedReaderFactory相关的代码
BufferedReader reader = ....
String line = null;
while((line = reader.readLine()) != null) {
line = line.replaceAll("\\s*$");
// do what you need with the line
}
public class DefaultTrimmingLineMapper<T> extends DefaultLineMapper<T> {
/**
* Trims the line before passing it to the {@link DefaultLineMapper}.
*
* @see org.springframework.batch.item.file.mapping.DefaultLineMapper#mapLine(java.lang.String, int)
*/
@Override
public T mapLine(String line, int lineNumber) throws Exception {
return super.mapLine(line!=null?line.trim():null, lineNumber);
}
}