Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从spring批处理程序的输入文件中删除所有行中的尾随空格_Java_File_Spaces_Spring Batch - Fatal编程技术网

Java 从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

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

数据由| |(双管道)分隔,行尾并没有分隔符

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