package com.activequant.archive.csv; import java.io.FileInputStream; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import java.util.Map; import com.activequant.archive.MultiValueTimeSeriesIterator; import com.activequant.archive.TSContainer; import com.activequant.archive.TimeSeriesIterator; import com.activequant.domainmodel.TimeStamp; import com.activequant.domainmodel.Tuple; import com.activequant.interfaces.archive.IArchiveReader; import com.activequant.interfaces.utils.IEventListener; import com.activequant.utils.CsvMapReader; /** * Can handle only single-stream CSV files. * Not multiple instruments in one file and is not time frame aware. * * @author GhostRider * */ public class CsvArchiveReaderFormat1 implements IArchiveReader { private String fileName; SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); public CsvArchiveReaderFormat1(String fileName) { this.fileName = fileName; } @Override public TSContainer getTimeSeries(final String streamId, final String key, final TimeStamp startTimeStamp) throws Exception { final List<TimeStamp> timeStamps = new ArrayList<TimeStamp>(); final List<Double> values = new ArrayList<Double>(); // import the soybeans example and treat it like a performance curve. new CsvMapReader().read(new IEventListener<Map<String, String>>() { @Override public void eventFired(Map<String, String> event) { try { String date = event.get("DATE"); String value = event.get(key); TimeStamp ts = new TimeStamp(sdf.parse(date)); if (ts.isAfter(startTimeStamp)) { timeStamps.add(ts); values.add(Double.parseDouble(value)); } } catch (ParseException e) { e.printStackTrace(); } } }, new FileInputStream(fileName)); return new TSContainer(timeStamps.toArray(new TimeStamp[] {}), values.toArray(new Double[] {})); } @Override public TSContainer getTimeSeries(String streamId, final String key, final TimeStamp startTimeStamp, final TimeStamp stopTimeStamp) throws Exception { final List<TimeStamp> timeStamps = new ArrayList<TimeStamp>(); final List<Double> values = new ArrayList<Double>(); // import the soybeans example and treat it like a performance curve. new CsvMapReader().read(new IEventListener<Map<String, String>>() { @Override public void eventFired(Map<String, String> event) { try { String date = event.get("DATE"); String value = event.get(key); TimeStamp ts = new TimeStamp(sdf.parse(date)); if (ts.isAfter(startTimeStamp) && ts.isBefore(stopTimeStamp)) { timeStamps.add(ts); values.add(Double.parseDouble(value)); } } catch (ParseException e) { e.printStackTrace(); } } }, new FileInputStream(fileName)); return new TSContainer(timeStamps.toArray(new TimeStamp[] {}), values.toArray(new Double[] {})); } @Override public TimeSeriesIterator getTimeSeriesStream(String streamId, String key, TimeStamp startTimeStamp, TimeStamp stopTimeStamp) throws Exception { // make an iterator. final TSContainer t = getTimeSeries(streamId, key, startTimeStamp, stopTimeStamp); TimeSeriesIterator tsi = getIterator(t); return tsi; } private TimeSeriesIterator getIterator(final TSContainer t) { TimeSeriesIterator tsi = new TimeSeriesIterator() { int index = 0; @Override public Tuple<TimeStamp, Double> next() { if(index!=t.values.length){ Tuple<TimeStamp, Double> ret = new Tuple<TimeStamp, Double>(t.timeStamps[index], t.values[index]); index = index + 1; return ret; } return null; } @Override public boolean hasNext() { if(index<t.values.length)return true; return false; } }; return tsi; } @Override public MultiValueTimeSeriesIterator getMultiValueStream(String streamId, TimeStamp startTimeStamp, TimeStamp stopTimeStamp) throws Exception { return null; } public SimpleDateFormat getSdf() { return sdf; } public void setSdf(SimpleDateFormat sdf) { this.sdf = sdf; } @Override public void close() throws IOException { // TODO Auto-generated method stub } }