package org.araqne.logdb.query.command;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.araqne.logdb.DriverQueryCommand;
import org.araqne.logdb.Row;
import au.com.bytecode.opencsv.CSVReader;
public class CsvFile extends DriverQueryCommand {
private List<String> filePaths;
private String filePath;
private long offset;
private long limit;
private final String cs;
public CsvFile(List<String> filePaths, String filePath, long offset, long limit, String cs) {
this.filePaths = filePaths;
this.filePath = filePath;
this.offset = offset;
this.limit = limit;
this.cs = cs;
}
@Override
public String getName() {
return "csvfile";
}
@Override
public void run() {
for (String filePath : filePaths)
readCsvFile(filePath);
}
private void readCsvFile(String filePath) {
FileInputStream is = null;
CSVReader reader = null;
long p = 0;
long count = 0;
try {
File f = new File(filePath);
is = new FileInputStream(f);
reader = new CSVReader(new InputStreamReader(is, cs), ',', '\"', '\0');
String[] headers = reader.readNext();
int headerCount = headers.length;
while (true) {
String[] items = reader.readNext();
if (items == null)
break;
p++;
if (p <= offset)
continue;
if (limit != 0 && count >= limit)
break;
int itemCount = items.length;
Map<String, Object> m = new HashMap<String, Object>();
for (int i = 0; i < Math.min(headerCount, itemCount); i++) {
m.put(headers[i], items[i]);
}
if (itemCount > headerCount) {
for (int i = headerCount; i < itemCount; i++) {
m.put("column" + i, items[i]);
}
}
m.put("_file", f.getName());
pushPipe(new Row(m));
count++;
}
} catch (Throwable t) {
throw new RuntimeException("csvfile load failure", t);
} finally {
IoHelper.close(reader);
IoHelper.close(is);
}
}
@Override
public String toString() {
String s = "csvfile";
if (offset > 0)
s += " offset=" + offset;
if (limit > 0)
s += " limit=" + limit;
if (!cs.equals("utf-8"))
s += " cs=" + cs;
s += " " + filePath;
return s;
}
}