1

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

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

Пример файла конфигурации, чтобы сделать приложение для загрузки:

Field; Position 
Name;0-20 
Surname;21-40 
Age;40-42 
Sex;42-43 
... 

Пример файла для анализа:

John William   Hoover23M 
Deborah     Foobar33F 
... 

Я видел много прибегая к помощи библиотек для разбора фиксированного файла длины.

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

Я хочу создать общий синтаксический анализатор, чтобы эти классы были автоматически сгенерированы и аннотированы на основе некоторого внешнего файла конфигурации.

Знаете ли вы какую-либо библиотеку или какой-либо другой подход, которым я мог бы следовать?

Я говорю о разборе относительно больших файлов около ~ 500 МБ, поэтому также важны фактор эффективности и скорости.

Спасибо всем!

ответ

0

Вам не нужно «разбирать» большой файл. Вам нужно только извлечь в заданных положениях

1 разберите файл формата с классическим регулярным выражением и сохраните имя, позиции в массиве. Время там не имеет значения.

2 откройте большой файл, прочитайте строки и извлеките нужные позиции. Это будет быстрее, чем вы могли бы это сделать.

+0

Действительно мне нужно что-то вроде этого: https://northconcepts.com/docs/examples/read -a-fixed-width-file-fixed-length-record-file /, но эта библиотека должна быть оплачена. Кто-нибудь знает что-то бесплатно? Если я не напишу сам ... – user1821021

0

Попробуйте uniVocity-parsers 'FixedWidthParser:

//define field lengths 
    FixedWidthFields fields = new FixedWidthFields(); 
    accountFields.addField("ID", 10); 
    accountFields.addField("Bank", 8); 
    accountFields.addField("AccountNumber", 15); 
    accountFields.addField("Swift", 12); 

    //configure the parser 
    FixedWidthParserSettings settings = new FixedWidthParserSettings(fields); //many options here, check the tutorial 
    settings.getFormat().setLineSeparator("\n"); 

    //We can now parse all rows 
    FixedWidthParser parser = new FixedWidthParser(settings); 
    List<String[]> rows = parser.parseAll(new File("/path/to/file.txt")); 

Это просто грубый пример. Существует много других примеров here.

Раскрытие информации: Я являюсь автором этой библиотеки, он с открытым исходным кодом и бесплатно (Apache 2.0 License)

Смежные вопросы