All Downloads are FREE. Search and download functionalities are using the official Maven repository.

internal.sdmxdl.cli.ext.CsvUtil Maven / Gradle / Ivy

The newest version!
package internal.sdmxdl.cli.ext;

import nbbrd.console.picocli.csv.CsvOutput;
import nbbrd.design.MightBePromoted;
import nbbrd.io.function.IOConsumer;
import nbbrd.io.picocsv.Picocsv;
import nbbrd.io.text.Formatter;
import nbbrd.picocsv.Csv;

import java.io.IOException;
import java.util.Iterator;
import java.util.Map;

@lombok.experimental.UtilityClass
public class CsvUtil {

    public static final Formatter> DEFAULT_LIST_FORMATTER = fromIterable(Formatter.onString(), ',');

    public static final Formatter> DEFAULT_MAP_FORMATTER = CsvUtil.fromMap(Formatter.onString(), Formatter.onString(), ',', '=');

    public static void write(CsvOutput csv, IOConsumer head, IOConsumer body) throws IOException {
        try (Csv.Writer w = csv.newCsvWriter()) {
            if (!csv.isAppending()) head.acceptWithIO(w);
            body.acceptWithIO(w);
        }
    }

    public static  Formatter> fromIterable(Formatter itemFormatter, char delimiter) {
        return elementsFormatter(itemFormatter)
                .format(Csv.Format.RFC4180.toBuilder().delimiter(delimiter).build())
                .build()
                .compose(Iterable::iterator)
                .asFormatter();
    }

    public static  Formatter> fromMap(Formatter keyFormatter, Formatter valueFormatter, char listDelimiter, char entryDelimiter) {
        return mapEntriesFormatter(keyFormatter, valueFormatter)
                .format(Csv.Format.RFC4180.toBuilder().delimiter(entryDelimiter).separator(String.valueOf(listDelimiter)).build())
                .build()
                .asFormatter()
                .compose(map -> map.entrySet().iterator());
    }

    @MightBePromoted
    private static  Picocsv.Formatter.Builder> elementsFormatter(Formatter element) {
        return Picocsv.Formatter.builder((iterator, csv) -> formatElements(csv, iterator, element));
    }

    private static  void formatElements(Csv.Writer csv, Iterator iterator, Formatter element) throws IOException {
        while (iterator.hasNext()) {
            csv.writeField(element.format(iterator.next()));
        }
    }

    @MightBePromoted
    private static  Picocsv.Formatter.Builder>> mapEntriesFormatter(Formatter key, Formatter value) {
        return Picocsv.Formatter.builder((mapEntries, csv) -> formatMapEntries(csv, mapEntries, key, value));
    }

    private static  void formatMapEntries(Csv.Writer csv, Iterator> mapEntries, Formatter key, Formatter value) throws IOException {
        if (mapEntries.hasNext()) {
            Map.Entry first = mapEntries.next();
            csv.writeField(key.format(first.getKey()));
            csv.writeField(value.format(first.getValue()));
            while (mapEntries.hasNext()) {
                csv.writeEndOfLine();
                Map.Entry next = mapEntries.next();
                csv.writeField(key.format(next.getKey()));
                csv.writeField(value.format(next.getValue()));
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy