package com.activequant.utils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import com.activequant.interfaces.utils.IEventListener;
import com.activequant.utils.events.Event;
/**
* Event based, stream reader, will read CSV lines from a stream and will then
* fire an event to an event listener.
*
* @author GhostRider
*
*/
public class CsvMapReader {
private String[] headerNames = null;
private String delimiter = ",";
public String getDelimiter() {
return delimiter;
}
public void setDelimiter(String delimiter) {
this.delimiter = delimiter;
}
/**
* use for files without header. if set, read in header will be ignored.
*/
public void setHeader(String[] header) {
this.headerNames = header;
}
/**
* will replace all " and ' with nothing. reads in streaming manner. Trims
* values to remove whitespace.
*
* @param eventListener
* @param fileName
* @throws IOException
*/
public void read(IEventListener<Map<String, String>> eventListener, InputStream inputStream) throws Exception {
int rowCount = 1;
String errorLine = "";
try {
Event<Map<String, String>> event = new Event<Map<String, String>>();
event.addEventListener(eventListener);
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
if (headerNames == null) {
String header = br.readLine();
header = header.replaceAll("\"", "");
header = header.replaceAll("'", "");
headerNames = header.split(",");
}
String line = br.readLine();
while (line != null) {
errorLine = line;
rowCount++;
line = line.replaceAll("\"", "");
line = line.replaceAll("'", "");
line = line.trim();
String[] content = line.split(delimiter);
Map<String, String> map = new HashMap<String, String>();
for (int i = 0; i < content.length; i++) {
String trimmedH = headerNames[i].trim().toUpperCase();
String trimmedC = content[i].trim();
map.put(trimmedH, trimmedC);
}
event.fire(map);
line = br.readLine();
}
} catch (Exception ex) {
throw new Exception("Error while parsing CSV stream, line " + rowCount + ": " + errorLine, ex);
}
}
}