Удаление завершающих пробелов во всех строках из входного файла в программу Spring Batch - PullRequest
2 голосов
/ 01 декабря 2011

У меня есть программа Spring Batch, которая читает из файла и записывает в базу данных.

Данные ограничены || (двойные трубы) и в конце строки разделитель отсутствует.

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 batch пробелы исчезли.

Как это сделать?

Примечание. Ошибка возникает только при запуске программы на сервере Unix. Это не происходит на окнах.

<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 ]

2 голосов
/ 01 декабря 2011

Расширьте 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() не приемлемо.

0 голосов
/ 06 октября 2016

Другое решение. Замените 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);
    }
}
0 голосов
/ 01 декабря 2011

Вот код:

BufferedReader reader = ....
String line = null;

while((line = reader.readLine()) != null) {
    line = line.replaceAll("\\s*$");
    // do what you need with the line
}

Если у вас есть автоматическая процедура, которая читает файлы и вставляет все в БД, и вы не можете изменить процедуру, создайте код, который читает файлы и удаляет завершающие пробелы (как показано выше) и записывает обрезанные строки в другой файл. Этот другой файл может быть входным для вашей процедуры импорта БД.

Кстати, если вы используете Linux, вы можете просто сказать:

cat myfile.txt | sed 's / * $ //'> mytrimmedfile.txt

(вероятно, в этом утверждении вы должны экранировать *)

...