从输入文件到spring批处理程序的所有行中删除尾随空格

时间:2011-12-01 13:07:30

标签: java file spaces spring-batch

我有一个弹簧批处理程序,它从文件读取并写入数据库。

数据由||分隔(双管)并且在行尾没有分隔符。

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对象删除尾随空格? 感谢您的阅读!!

3 个答案:

答案 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);
    }
}