Какой подход использовать для анализа файла с записями фиксированной длины, когда макет записи неизвестен до времени выполнения? - PullRequest
3 голосов
/ 29 июля 2011

Я хочу проанализировать файл на основе макета записи, предоставленной в другом файле.

По сути, это будет файл определения, представляющий собой список полей с разделителями-запятыми и их соответствующих длин.Их будет много, новый будет загружаться при каждом запуске программы.

firstName,text,20
middleInitial,text,1
lastName,text,20
salary,number,10

Затем я выведу на экран пустую таблицу с предоставленными заголовками столбцов и опцию добавления данных, нажавкнопка или что-то еще - я еще не решил.

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

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

Adam                DSmith               50000
Brent               GWilliams            45000
Harry               TThompson            47500

Какие типы шаблонов могут быть полезныздесь, и может ли кто-нибудь дать мне приблизительное руководство о том, как структурировать способ внутреннего хранения и моделирования данных.

Я хотел бы подумать, что могу найти способ справиться с документацией Java, но еслиможете указать мне куда-то, чтобы начать искать, это было бы очень признательно!

Спасибо

1 Ответ

3 голосов
/ 29 июля 2011

Мне кажется, что у вас есть файл howToParse и файл infoToParse с указаниями о том, как анализировать информацию и информацию для анализа в этих файлах соответственно.

Сначала я прочитал бы в файле howToParse и создал бы какой-нибудь динамический объект Parser. Похоже, что каждая строка в этом файле - это отдельный объект ParsingStep. Затем вам просто нужно прочитать строку, которая будет сохранена как объект String, и просто разделить ParsingStep на 3 части: имя поля, тип данных, длина данных.

// Create new parser to hold parsing steps.
Parser dynamicParser = new Parser();

// Create new scanner to read through parse file.
Scanner parseFileScanner = new Scanner(howToParseFileName);

// *** Add exception handling as necessary *** this is just an example    

// Read till end of file.
while (parseFileScanner.hasNext()) {
    String line = parseFileScanner.nextLine(); // Get next line in file.

    String[] lineSplit = line.split(","); // Split on comma
    String fieldName   = lineSplit[0];
    String dataType    = lineSplit[1];
    String dataLength  = lineSplit[2];  // Convert to Integer with Integer.parseInt();

    ParsingStep step = new ParsingStep(fieldName, dataType, dataLength);
    dynamicParser.addStep(step);
}

parseFileScanner.close();

Тогда вам нужно будет разобрать строку, тогда вам просто нужно проанализировать другой файл и сохранить информацию из этого файла, вероятно, в массиве.

// Open infoToParse file and start reading.
Scanner infoScanner = new Scanner(infoToParseFileName);

// Add exception handling.
while (infoScanner.hasNext()) {
    String line = infoScanner.nextLine();

    // Parse line and return a Person object or maybe just a Map of field names to values
    Map<String,String> personMap = dynamicParser.parse(line);
} 

infoScanner.close();

Тогда единственный другой код - это просто проверка синтаксического анализатора в правильном порядке.

public class Parser {
    private ArrayList<ParsingStep> steps;

    public Parser() {
        steps = new ArrayList<ParsingStep>();
    }

    public void addStep(ParsingStep step) {
        steps.add(step);
    }

    public Map<String,String> parse(String line) {
        String remainingLine = line;

        for (ParsingStep step : steps) {
            remainingLine = step.parse(remainingLine);
        }

        return map; // Somehow convert to map.
    }
}

Лично я бы добавил некоторые проверки ошибок на этапах разбора на тот случай, если файл infoToParse имеет неправильный формат.

Надеюсь, это поможет.

...