/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.util.csv; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Iterator; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.fudgemsg.FudgeContext; import org.fudgemsg.FudgeMsg; import org.fudgemsg.MutableFudgeMsg; import au.com.bytecode.opencsv.CSVReader; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.fudgemsg.OpenGammaFudgeContext; /** * */ public class FudgeMsgCSVIterator implements Iterator<FudgeMsg> { private static final FudgeContext s_fudgeContext = OpenGammaFudgeContext.getInstance(); private CSVReader _csvReader; private String[] _header; private String[] _currentRow; public FudgeMsgCSVIterator(InputStream input, char separator, char quotechar, char escape) { ArgumentChecker.notNull(input, "inputstream"); ArgumentChecker.notNull(separator, "separator"); ArgumentChecker.notNull(quotechar, "quotechar"); ArgumentChecker.notNull(escape, "escape"); try { _csvReader = new CSVReader(new BufferedReader(new InputStreamReader(input)), separator, quotechar, escape); _header = _csvReader.readNext(); if (_header == null) { throw new OpenGammaRuntimeException("Column headers is missing, can not create iterator"); } else { trimColumnHeaders(); } } catch (IOException ex) { throw new OpenGammaRuntimeException("IO Exception trying to read next line", ex); } } private void trimColumnHeaders() { for (int i = 0; i < _header.length; i++) { _header[i] = StringUtils.trim(_header[i]); } } @Override public boolean hasNext() { try { _currentRow = _csvReader.readNext(); } catch (IOException ex) { throw new OpenGammaRuntimeException("IO Exception trying to read next row", ex); } if (_currentRow == null) { IOUtils.closeQuietly(_csvReader); _csvReader = null; } return _currentRow != null; } @Override public FudgeMsg next() { MutableFudgeMsg currentMsg = s_fudgeContext.newMessage(); int size = getMessageSize(); for (int i = 0; i < size; i++) { String currentRow = StringUtils.trimToNull(_currentRow[i]); if (currentRow != null) { currentMsg.add(_header[i], currentRow); } } return currentMsg; } private int getMessageSize() { int size = _header.length; if (_currentRow.length < size) { size = _currentRow.length; } return size; } @Override public void remove() { throw new UnsupportedOperationException("Cannot remove CSV row"); } @Override protected void finalize() throws Throwable { //close file inputstream if it is still hanging around if (_csvReader != null) { IOUtils.closeQuietly(_csvReader); } } }