Skip to content

feat: CSV writer implementation#48

Open
bizzare-owl wants to merge 3 commits into
EffectiveMobile:mainfrom
bizzare-owl:dev
Open

feat: CSV writer implementation#48
bizzare-owl wants to merge 3 commits into
EffectiveMobile:mainfrom
bizzare-owl:dev

Conversation

@bizzare-owl

Copy link
Copy Markdown

Реализация CsvWriter

Использование

Для маппинга объектов в CSV-формат необходимо отметить поля класса, которые будут сохранятся в CSV-файл, аннотацией CsvInclude.

Пример

@AllArgsConstructor
@Getter
public class ExampleClass {
    @CsvInclude
    private final int intField; 

    private final int notIncludedField; // не будет включено в CSV-файл
}

Определение стратегий экранирования и маппинга

В случае если значение поля может содержать запятые, то данное значение можно экранировать в зависимости от выбранной стратегии QUOTE_ESCAPING или COLUMN_ESCAPING

Пример использования стратегий экранирования

public class Main {

    @Getter
    private static class EscapingClass {
        @CsvInclude(escape = @Escape(strategy = EscapeStrategy.QUOTE_ESCAPING))
        private final String valueWithCommas = "value,and,comma";

        @CsvInclude(escape = @Escape(strategy = EscapeStrategy.COLUMN_ESCAPING))
        private final String anotherValueWithCommas = "another,comma";
    }

    public static void main(String[] args) {
        CsvWriter writer = new CsvWriter();
        writer.writeToFile(List.of(new EscapingClass()), "csvFileName.csv");
    }

}

csvFileName.csv

"value,and,comma",another,comma

Определение стратегий маппинга перечислений

Для маппинга перечислений можно использовать стратегию маппинга по имени и по ординалу значения

Пример стратегий маппинга перечислений

public class Main {

    private static enum ExampleEnum {
        FIRST,
        SECOND
    }

    @Getter
    private static class EnumMappingClass {
        @CsvInclude(enumMapping = @EnumMapping(strategy = EnumMappingStrategy.NAME))
        private final ExampleEnum first = ExampleEnum.FIRST; 

        @CsvInclude(enumMapping = @EnumMapping(strategy = EnumMappingStrategy.ORDINAL))
        private final ExampleEnum second= ExampleEnum.SECOND;  
    }

    public static void main(String[] args) {
        CsvWriter writer = new CsvWriter();
        writer.writeToFile(List.of(new EnumMappingClass()), "csvFileName.csv");
    }

}

csvFileName.csv

FIRST,1

Определение стратегий маппинга коллекций

Для маппинга коллекций можно использовать стратегию маппинга с помощью преобразования в строку и маппинга отдельных значений в отдельные колонки

Пример стратегий маппинга коллекций

public class Main {

    @Getter
    private static class CollectionMappingClass {
        @CsvInclude(collectionMapping = @CollectionMapping(strategy = CollectionMappingStrategy.STRINGIFY))
        private final List<String> list= List.of("first", "second"); 

        @CsvInclude(collectionMapping = @CollectionMapping(strategy = CollectionMappingStrategy.ITEM_COLUMN))
        private final List<Integer> integers = List.of(1, 2, 3, 4, 5);  
    }

    public static void main(String[] args) {
        CsvWriter writer = new CsvWriter();
        writer.writeToFile(List.of(new CollectionMappingClass()), "csvFileName.csv");
    }

}

csvFileName.csv

"[first, second]",1,2,3,4,5

Особенности использования

При вызове метода CsvWriter.writeToFile(List, String) файл создается в директории откуда запущено приложения, то есть в System.getProperty("user.dir")

@bizzare-owl
bizzare-owl marked this pull request as draft October 8, 2025 19:12
@bizzare-owl
bizzare-owl marked this pull request as ready for review October 8, 2025 19:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants