Skip to content
Snippets Groups Projects
Commit 62b5eaf4 authored by Bernhard Johannes Berger's avatar Bernhard Johannes Berger
Browse files

Added a CSV properties reader/writer

parent 2a2b98c3
No related branches found
No related tags found
No related merge requests found
Pipeline #280614 passed
package de.evoal.core.main.properties;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.ObjectMapper;
import de.evoal.core.api.properties.Properties;
import de.evoal.core.api.properties.PropertiesSpecification;
import de.evoal.core.api.properties.PropertySpecification;
import de.evoal.core.api.properties.io.PropertiesReader;
import de.evoal.core.api.utils.EvoalIOException;
import de.evoal.core.api.utils.Requirements;
import de.evoal.languages.model.ddl.DataDescription;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import javax.enterprise.context.Dependent;
import javax.inject.Named;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Slf4j
@Dependent
@Named("csv-reader")
public class CSVPropertiesReader implements PropertiesReader {
private PropertiesSpecification specification;
private CSVParser parser;
private Iterator<CSVRecord> iterator;
private NumberFormat nf = NumberFormat.getInstance(Locale.US);
@Override
public PropertiesReader init(final File inputFile, final PropertiesSpecification specification) throws EvoalIOException {
log.info("Creating JSON properties reader for {}.", specification);
this.specification = specification;
try {
parser = CSVParser.parse(inputFile, Charset.forName("UTF8"), CSVFormat.RFC4180.withHeader());
iterator = parser.iterator();
} catch (IOException e) {
throw new EvoalIOException("Failed to parse CSV file " + inputFile, e);
}
return this;
}
@Override
public void close() throws Exception {
parser.close();
}
@Override
public boolean hasNext() {
return iterator.hasNext();
}
@Override
@SneakyThrows({ParseException.class})
public Properties next() {
return readProperties();
}
private Properties readProperties() throws ParseException {
final CSVRecord record = iterator.next();
final Properties p = new Properties(specification);
for(final PropertySpecification s : specification.getProperties()) {
final String strValue = record.get(s.name());
final Object value = switch (s.type().getRepresentation()) {
case BOOLEAN -> Boolean.parseBoolean(strValue);
case INTEGER -> "Infinity".equals(strValue) ? Integer.MAX_VALUE : nf.parse(strValue);
case REAL -> "Infinity".equals(strValue) ? Double.POSITIVE_INFINITY : nf.parse(strValue);
case STRING -> strValue;
};
p.put(s, value);
}
return p;
}
}
package de.evoal.core.main.properties;
import de.evoal.core.api.properties.Properties;
import de.evoal.core.api.properties.PropertiesSpecification;
import de.evoal.core.api.properties.PropertySpecification;
import de.evoal.core.api.properties.io.PropertiesReader;
import de.evoal.core.api.properties.io.PropertiesWriter;
import de.evoal.core.api.statistics.writer.Column;
import de.evoal.core.api.utils.EvoalIOException;
import lombok.NonNull;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVPrinter;
import org.apache.commons.csv.CSVRecord;
import javax.enterprise.context.Dependent;
import javax.inject.Named;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.Charset;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Iterator;
import java.util.Locale;
@Slf4j
@Dependent
@Named("csv-writer")
public class CSVPropertiesWriter implements PropertiesWriter {
private CSVPrinter csvPrinter;
private FileWriter csvWriter;
private NumberFormat nf = NumberFormat.getInstance(Locale.US);
private PropertiesSpecification specification;
@Override
public void add(@NonNull Properties properties) throws EvoalIOException {
try {
csvPrinter.printRecord(properties.getValues());
} catch (IOException e) {
throw new EvoalIOException("Failed to write recored.", e);
}
}
@Override
public PropertiesWriter init(final File outputFile, final PropertiesSpecification specification) throws EvoalIOException {
log.info("Creating CSV properties writer for {} to file {}.", specification, outputFile);
this.specification = specification;
try {
final String[] fileHeader = new String[specification.size()];
for(int i = 0; i < fileHeader.length; ++i) {
fileHeader[i] = specification.getProperties().get(0).name();
}
csvWriter = new FileWriter(outputFile);
csvPrinter = new CSVPrinter(csvWriter,
CSVFormat.DEFAULT
.withHeader(fileHeader));
} catch (IOException e) {
throw new EvoalIOException("Failed to open CSV file " + outputFile + " for writing.", e);
}
return this;
}
@Override
public void close() throws Exception {
csvWriter.close();
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment