Утилита для фильтрации содержимого файлов по типам данных (целые числа, вещественные числа, строки) с возможностью сбора статистики.
Утилита читает один или несколько входных файлов, содержащих в перемешку целые числа, строки и вещественные числа (разделитель - перевод строки), и записывает разные типы данных в отдельные выходные файлы. Поддерживает сбор краткой и полной статистики по каждому типу данных.
- Язык программирования: Java
- Версия Java: 25
- Система сборки: Maven
- Версия Maven: 4.0.0
- Кодировка: UTF-8
Проект реализован с соблюдением принципов SOLID:
-
Single Responsibility Principle (SRP): Каждый класс отвечает за одну задачу:
LineParser- парсинг строк и определение типа данныхInputFileReader- чтение файловOutputWriter- запись результатовStatisticColletor- сбор статистикиCommandLineParser- разбор аргументов командной строки
-
Dependency Inversion Principle (DIP): Использование интерфейсов (
InputFileReader,OutputWriter,Statistic) позволяет легко заменять реализации -
Open/Closed Principle (OCP): Расширяемость через интерфейсы без изменения существующего кода
src/main/java/org/example/
├── config/ # Конфигурация и парсинг аргументов
│ ├── AppConfig.java
│ ├── CommandLineArg.java
│ ├── CommandLineParser.java
│ └── ParseResult.java
├── io/ # Ввод-вывод
│ ├── InputFileReader.java (интерфейс)
│ ├── InputFileReaderImpl.java
│ ├── OutputWriter.java (интерфейс)
│ └── OutputWriterImpl.java
├── model/ # Модели данных
│ └── DataType.java (enum)
├── parser/ # Парсинг строк
│ ├── LineParser.java
│ └── ParsedLine.java (DTO)
├── statistics/ # Статистика
│ ├── Statistic.java (интерфейс)
│ ├── IntegerStatistic.java
│ ├── FloatStatistic.java
│ ├── StringStatistic.java
│ └── StatisticColletor.java
├── FilterService.java # Оркестрация процесса
└── Main.java # Точка входа
-
LineParser - определяет тип данных (INTEGER, FLOAT, STRING) через последовательную проверку:
- Сначала пытается распарсить как
Long(целое число) - Затем как
Double(вещественное число, включая научную нотацию) - Иначе считает строкой
- Сначала пытается распарсить как
-
ParsedLine - DTO (Data Transfer Object) для передачи результата парсинга с типом и значением
-
StatisticColletor - собирает статистику по каждому типу данных:
- Краткая статистика: количество элементов
- Полная статистика: для чисел - min, max, sum, average; для строк - min/max длина
-
Обработка ошибок: Программа не падает при ошибках чтения/записи файлов, выводит сообщения в stderr и продолжает работу с остальными файлами
- JDK 25 или выше
- Maven 3.6+ (или используйте встроенный Maven в IntelliJ IDEA)
# Компиляция
mvn clean compile
# Сборка JAR
mvn clean packageПосле сборки JAR файл будет находиться в target/FilterUtil-1.0-SNAPSHOT.jar
java -jar target/FilterUtil-1.0-SNAPSHOT.jar [опции] файл1.txt файл2.txt ...-o <путь>- путь для выходных файлов (по умолчанию: текущая директория)-p <префикс>- префикс имен выходных файлов (по умолчанию: пустая строка)-a- режим добавления в существующие файлы (по умолчанию: перезапись)-s- краткая статистика (только количество элементов)-f- полная статистика (количество + min/max/sum/average для чисел, min/max длина для строк)
# Базовый запуск с краткой статистикой
java -jar target/FilterUtil-1.0-SNAPSHOT.jar -s in1.txt in2.txt
# С префиксом и режимом добавления
java -jar target/FilterUtil-1.0-SNAPSHOT.jar -s -a -p sample- in1.txt in2.txt
# Полная статистика с указанием выходной директории
java -jar target/FilterUtil-1.0-SNAPSHOT.jar -f -o /path/to/output -p result_ in1.txt in2.txtВходные файлы содержат данные в перемешку, разделённые переводом строки:
Lorem ipsum dolor sit amet
45
Пример
3.1415
consectetur adipiscing
-0.001
тестовое задание
100500
По умолчанию создаются файлы:
integers.txt- целые числаfloats.txt- вещественные числаstrings.txt- строки
С опцией -p sample- файлы будут называться:
sample-integers.txtsample-floats.txtsample-strings.txt
Важно: Файлы создаются только если соответствующий тип данных присутствует во входных файлах.
Краткая статистика (-s):
Целые числа: 3
Вещественные числа: 3
Строки: 5
Полная статистика (-f):
Целые числа: 3, мин: 45, макс: 1234567890123456789, сумма: 1234567890123557334, среднее: 411522630041185800,00
Вещественные числа: 3, мин: -0.001, макс: 3.1415, сумма: 3.1405000000000003, среднее: 1.0468333333333335
Строки: 5, мин. длина: 4, макс. длина: 26
- Откройте проект в IntelliJ IDEA
- Откройте
Main.java - Нажмите правой кнопкой мыши →
Run 'Main.main()' - Для передачи аргументов:
Run→Edit Configurations→ в полеProgram argumentsукажите опции и файлы
Пример Program arguments:
-s -a -p sample- in1.txt in2.txt
Примечание: Убедитесь, что входные файлы находятся в рабочей директории проекта (там, где pom.xml), или укажите полные пути к файлам.