package nl.wldelft.fews.system.plugin.dataExport;

import nl.wldelft.util.io.LineWriter;
import nl.wldelft.util.io.TextSerializer;
import nl.wldelft.util.timeseries.TimeSeriesContent;
import nl.wldelft.util.timeseries.TimeSeriesHeader;

public class CsvTimeSeriesSerializer implements TextSerializer<TimeSeriesContent> {
    private char decimalSeparator = '.';
    private char columnSeparator = ',';


    @Override
    public void serialize(TimeSeriesContent content, LineWriter writer, String virtualFileName) throws Exception {
        if (Float.isNaN(content.getDefaultMissingValue())) content.setMissingValue(-999f);
        content.setUnreliablesAsMissings(true);

        String[] locationHeader = new String[content.getTimeSeriesCount() + 1];
        String[] parameterHeader = new String[content.getTimeSeriesCount() + 1];
        locationHeader[0] = "";
        parameterHeader[0] = "";

        for (int i = 0, n = content.getTimeSeriesCount(); i < n; i++) {
            content.setTimeSeriesIndex(i);
            TimeSeriesHeader timeSeriesHeader = content.getTimeSeriesHeader();
            locationHeader[i + 1] = timeSeriesHeader.getLocationId();
            parameterHeader[i + 1] = timeSeriesHeader.getParameterId();
        }

        writer.writeLine(locationHeader, columnSeparator);
        writer.writeLine(parameterHeader, columnSeparator);

        String[] line = new String[content.getTimeSeriesCount() + 1];
        for (int i = 0, n = content.getContentTimeCount(); i < n; i++) {
            content.setContentTimeIndex(i);
            line[0] = content.getTime(content.getDefaultTimeZone(), "yyyy-MM-dd HH:mm:ss");
            for (int j = 0, m = content.getTimeSeriesCount(); j < m; j++) {
                content.setTimeSeriesIndex(j);
                line[j + 1] = content.getValue(decimalSeparator);
            }
            writer.writeLine(line, columnSeparator);
        }
    }

    public char getDecimalSeparator() {
        return decimalSeparator;
    }

    public void setDecimalSeparator(char decimalSeparator) {
        this.decimalSeparator = decimalSeparator;
    }

    public char getColumnSeparator() {
        return columnSeparator;
    }

    public void setColumnSeparator(char columnSeparator) {
        this.columnSeparator = columnSeparator;
    }
}
  • No labels