/fileparser

Проект для выполнения тестового задания

Primary LanguageJava

Условия задания

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

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

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

  1. Маска имени файла для разбора
  2. Разделители строк и колонок входного файла
  3. Фильтр для строк, какие строки нужно разбирать
  4. Конфигурация какие колонки необходимо использовать для выходного файла
  5. Разделители строк и колонок выходного файла
  6. Именование выходного файла
    • Использовать исходное имя
    • Использовать исходное имя + префикс
    • Использовать своё имя с инкриментом для каждого нового файла
  7. Указывается входная директория в которую поступают файлы
  8. Указывается выходная директория куда поступают файлы после трансляции Приложение не должно проводить повторную трансляцию файла если он уже был ранее обработан.

Запуск скомпилированного приложения

Скомпилированное приложение и необходимые для работы конфигурационный файлы находятся в директории build:

  • config - директория с настройками
    • config.xml - настройки приложения
    • log4j2.xml - настройки логирования
  • in - директория входных файлов
  • out - директория выходных файлов. При отсутствии создается при экспорте файлов
  • archive - директория архивных файлов. При отсутствии создается при архивировании файлов
  • fileparser.jar - исполняемый файл приложения
  • run.bat - файл для запуска приложения на Windows
  • input_1.csv - тестовый файл для преобразования

Для запуска на Windows необходимо запустить файл run.bat

Краткое описание реализации

Приложение представляет собой консольную утилиту.

При запуске считывается конфигурация из файла config.xml и хранится в экземпляре singleton класса Configuration

После запуска в отдельном потоке стартует экземпляр ProcessorRunner, который с определенной периодичностью запускает обработку файлов с помощью экземпляра DelimitedFileProcessor.

DelimitedFileProcessor занимается чтением файлов и построчной обработкой каждого файла, после завершения которой файл переносится в архивную папку.

При создании DelimitedFileProcessor инициализируется его настройки в экземпляре DelimitedProcessorConfig, который содержит настройки входных, выходных и архивных файлов, а также настройки колонок в строке.

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

Для каждого файла производится построчная обработка с проверкой каждой строки посредством RegexLineFilter на удовлетворение шаблону строки из настроек.

Построчным парсингом и экспортом файлов занимаются соответственно:

  • DelimitedParser - разбивает переданную строку по regexp-шаблону с заданным разделителем.
  • DelimitedExporter - формирует строку с колонками, которые отмечены в настройках как эспортируемые, и заданными разделителями. С помощью переданного при создании writer сохраняет сформированную строку в файл.

При создании DelimitedExporter формируется путь к эспортируемому файлу, состоящий из:

  • пути к директории выходных файлов, заданному в настройках
  • имени выходного файла, шаблон которого задан в настройках.

Шаблон имени выходного и архивного файлов может содержать произвольный текст и преднастроенные элементы, что позволяет формировать имя файла, не ограничиваясь указанными в Задании вариантами (н-р, out-{INPUT_NAME}-{SEQ}-{TIME}.txt)

  • {INPUT_NAME} - имя входного файла
  • {INPUT_EXT} - расширение входного файла (для архивных файлов)
  • {SEQ} - инкремент файла с начала работы программы
  • {DATE} - текущая дата (yyyy-mm-dd)
  • {TIME} - текущее время (HH_mm_ss)
  • {DATE_TIME} - текущие дата и время (yyyy-mm-dd_HH_mm_ss)

В настройках config.xml также описываются колонки входного файла config.processors.delimiterProcessor.columns. Данная настройка нужна для определения порядка колонок и проставления флага необходимости экспорта для отдельных колонок. Например:

<columns>
    <column exported="true">Date</column>
    <column exported="true">Time</column>
    <column>Col 3</column>
    <column>Col 4</column>
</columns> 

Для экспорта колонки, должны быть описаны все предшествуюшие ей колонки.