Разбор плоского файла в Java

У меня есть плоский файл, в котором данные хранятся в формате, основанном на позиции. Например. от 1 до 5 - сохраняется некоторое значение x, от 6 до 13 - сохраняется некоторое значение y, от 14 до 18 - сохраняется некоторое значение z и т. д. Мне нужно проанализировать файл, получить эти значения и заполнить bean-компонент.

Может кто-нибудь, пожалуйста, скажите мне, как лучше всего это сделать, это означает, как я могу разобрать файл. Я использую Java 6.


person Anand    schedule 14.01.2013    source источник
comment
На каком именно этапе вы застряли? Чтение файла построчно, используя, например. BufferedReader#readLine() или подстрока строки, например. String#substring()? Хотя это довольно простые методы. Они уже упоминались в базовом руководстве Oracle по Java.   -  person BalusC    schedule 14.01.2013
comment
Вы должны сначала попробовать что-то сами, а затем вернуться с более конкретным вопросом, если у вас возникнут проблемы.   -  person James Montagne    schedule 14.01.2013
comment
Вы можете использовать java.util.Scanner для чтения каждого строка плоского файла. Если есть шаблон, который разделяет данные, например вертикальная черта (|) или запятая (,), вы можете использовать String#split для разделения данных и их распространения, если это не ваш случай, вы можете использовать String#substring, чтобы разделить данные частично.   -  person Luiggi Mendoza    schedule 14.01.2013


Ответы (1)


Несложные строки фиксированной длины должны быть очень простыми в простой Java.

Почему бы вам просто не использовать простую базовую подстроку? Я видел, как это использовалось при разборе довольно больших плоских файлов, и это не так плохо, как кажется. Довольно легко получить обзор от него.

myObject.setX(Integer.parseInt(input.substring(0,4)));
myObject.setY(input.substring(5,12); 
..  

Если вы действительно серьезно относитесь к сопоставлению нескольких больших плоских файлов с java, вы можете использовать некоторую библиотеку.

Smooks позволяет указать сопоставление в XML-файле, а среда выполнения smooks сопоставляет поля с объектом. Существует также Eclipse IDE для графического отображения. Эта библиотека несколько тяжеловесна.

Мне очень нравится компонент Bindy в Apache Camel. Это требует накладных расходов на введение маршрутизатора сообщений, но можно аннотировать простые классы Java и просто выполнять сопоставление и класс Java за один раз.

// Like this
@FixedLengthRecord(length=54, paddingChar=' ')
public static class Order {

    @DataField(pos = 1, length=2)
    private int orderNr;

    @DataField(pos = 3, length=2)
    private String clientNr;
person Petter Nordlander    schedule 14.01.2013