/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.integration.copier.sheet.reader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; import au.com.bytecode.opencsv.CSVReader; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.util.ArgumentChecker; /** * A class to facilitate importing portfolio data from comma-separated value files */ public class CsvSheetReader extends SheetReader { private CSVReader _csvReader; public CsvSheetReader(String filename) { ArgumentChecker.notEmpty(filename, "filename"); // Open file InputStream fileInputStream = openFile(filename); // Set up CSV reader _csvReader = new CSVReader(new InputStreamReader(fileInputStream)); // Set columns setColumns(readHeaderRow()); } public CsvSheetReader(InputStream inputStream) { ArgumentChecker.notNull(inputStream, "inputStream"); // Set up CSV reader _csvReader = new CSVReader(new InputStreamReader(inputStream)); // Set columns setColumns(readHeaderRow()); } @Override public Map<String, String> loadNextRow() { // Read in next row String[] rawRow; try { rawRow = _csvReader.readNext(); } catch (IOException ex) { throw new OpenGammaRuntimeException("Error reading CSV file data row: " + ex.getMessage()); } // Return null if EOF if (rawRow == null) { return null; } // Map read-in row onto expected columns Map<String, String> result = new HashMap<String, String>(); for (int i = 0; i < getColumns().length; i++) { if (i >= rawRow.length) { break; } if (rawRow[i] != null && rawRow[i].trim().length() > 0) { result.put(getColumns()[i], rawRow[i]); } } return result; } private String[] readHeaderRow() { // Read in the header row String[] rawRow; try { rawRow = _csvReader.readNext(); } catch (IOException ex) { throw new OpenGammaRuntimeException("Error reading CSV file header row: " + ex.getMessage()); } // Normalise read-in headers (to lower case) and set as columns String[] columns = new String[rawRow.length]; for (int i = 0; i < rawRow.length; i++) { columns[i] = rawRow[i].trim().toLowerCase(); } return columns; } @Override public void close() { try { _csvReader.close(); } catch (IOException ex) { } } }