我有一个弹簧批处理程序,它从文件读取并写入数据库。
数据由||分隔(双管)并且在行尾没有分隔符。
one||two||three||four
foo||bar||foo1||bar1
问题是每行的结尾在行尾字符之前有数百个尾随空格。
使用ctrl + Q,我在文本板中显示:
one||two||three||four.......................................
foo||bar||foo1||bar1...............
car||bike||tango||charlie..........................
这会在ItemReader(org.springframework.batch.item.file.FlatFileItemReader)中的每一行抛出解析错误
我无法手动删除空格并需要一些自动化,因此在弹出批处理程序读取文件之前,空格已经消失。
怎么做?
注意:仅当我通过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>
进步了一下。但仍然没有找到答案。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import org.springframework.batch.item.file.BufferedReaderFactory;
import org.springframework.core.io.Resource;
public class MyBufferedReaderFactory implements BufferedReaderFactory {
public BufferedReader create(final Resource resource, final String encoding) throws UnsupportedEncodingException, IOException {
InputStream sourceStream = null;
sourceStream = resource.getInputStream();
//code to remove trailing spaces end
//code to remove trailing spaces start
return new BufferedReader(new InputStreamReader(sourceStream, encoding));
}
}
如何在上面的类中使用InputStream对象删除尾随空格? 感谢您的阅读!!
答案 0 :(得分:2)
通过实施BufferedReader
扩展BufferedReaderFactory
并为读者添加行修剪功能。请参阅FlatFileItemReader.setBufferedReaderFactory()。
public class LineTrimmingBufferedReader extends BufferedReader
{
public LineTrimmingBufferedReader(Reader in)
{
super(in);
}
@Override
public String readLine() throws IOException
{
String result = super.readLine();
return result != null ? result.trim() : null;
}
}
如果String.trim()
不可接受,请对该行实施适当的尾随空格修剪。
答案 1 :(得分:0)
以下是代码:
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 / * $ //'&gt; mytrimmedfile.txt
(可能你必须在此声明中逃避*
)
答案 2 :(得分:0)
另一种解决方案。使用以下自定义类DefaultTrimmingLineMapper替换配置中的DefaultLineMapper。
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);
}
}