// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.opendata.core.io.tabular; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.Charset; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.osm.DataSet; import org.openstreetmap.josm.gui.progress.ProgressMonitor; import org.openstreetmap.josm.plugins.opendata.core.OdConstants; import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler; import org.openstreetmap.josm.plugins.opendata.core.util.OdUtils; public class CsvReader extends SpreadSheetReader { private final Charset charset; private String sep; private BufferedReader reader; private String line; public CsvReader(CsvHandler handler) { this(handler, ";"); } public CsvReader(CsvHandler handler, String defaultSep) { super(handler); this.charset = handler != null && handler.getCharset() != null ? handler.getCharset() : Charset.forName(OdConstants.UTF8); this.sep = handler != null && handler.getSeparator() != null ? handler.getSeparator() : defaultSep; } public static DataSet parseDataSet(InputStream in, AbstractDataSetHandler handler, ProgressMonitor instance) throws IOException { CsvHandler csvHandler = null; if (handler != null && handler.getSpreadSheetHandler() instanceof CsvHandler) { csvHandler = (CsvHandler) handler.getSpreadSheetHandler(); } CsvReader csvReader = new CsvReader(csvHandler); try { return csvReader.parse(in, instance); } catch (IllegalArgumentException e) { if (csvHandler == null || csvHandler.getSeparator() == null || ";".equals(csvHandler.getSeparator())) { // If default sep has been used, try comma Main.warn(e.getMessage()); csvReader.sep = ","; return csvReader.doParse(csvReader.splitLine(), instance); } else { throw e; } } } @Override protected void initResources(InputStream in, ProgressMonitor progressMonitor) throws IOException { Main.info("Parsing CSV file using charset "+charset+" and separator '"+sep+"'"); reader = new BufferedReader(new InputStreamReader(in, charset)); } @Override protected String[] readLine(ProgressMonitor progressMonitor) throws IOException { line = reader.readLine(); return splitLine(); } private String[] splitLine() { if (line != null) { return OdUtils.stripQuotesAndExtraChars(line.split(sep), sep); } else { return null; } } }