/*
* Encog(tm) Core v3.4 - Java Version
* http://www.heatonresearch.com/encog/
* https://github.com/encog/encog-java-core
* Copyright 2008-2016 Heaton Research, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* For more information on Heaton Research copyrights, licenses
* and trademarks visit:
* http://www.heatonresearch.com/copyright
*/
package org.encog.app.analyst.csv.basic;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.encog.app.quant.QuantError;
import org.encog.util.csv.CSVFormat;
import org.encog.util.csv.ReadCSV;
import org.encog.util.logging.EncogLogging;
/**
* Forms the foundation of all of the cached files in Encog Quant.
*/
public class BasicCachedFile extends BasicFile {
/**
* The column mapping.
*/
private final Map<String, BaseCachedColumn> columnMapping
= new HashMap<String, BaseCachedColumn>();
/**
* The columns.
*/
private final List<BaseCachedColumn> columns
= new ArrayList<BaseCachedColumn>();
/**
* Add a new column.
*
* @param column
* The column to add.
*/
public void addColumn(final BaseCachedColumn column) {
this.columns.add(column);
this.columnMapping.put(column.getName(), column);
}
/**
* Analyze the input file.
*
* @param input
* The input file.
* @param headers
* True, if there are headers.
* @param format
* The format of the CSV data.
*/
public void analyze(final File input, final boolean headers,
final CSVFormat format) {
resetStatus();
setInputFilename(input);
setExpectInputHeaders(headers);
setInputFormat(format);
this.columnMapping.clear();
this.columns.clear();
// first count the rows
BufferedReader reader = null;
try {
int recordCount = 0;
reader = new BufferedReader(new FileReader(getInputFilename()));
while (reader.readLine() != null) {
updateStatus(true);
recordCount++;
}
if (headers) {
recordCount--;
}
setRecordCount(recordCount);
} catch (final IOException ex) {
throw new QuantError(ex);
} finally {
reportDone(true);
if (reader != null) {
try {
reader.close();
} catch (final IOException e) {
throw new QuantError(e);
}
}
setInputFilename(input);
setExpectInputHeaders(headers);
setInputFormat(format);
}
// now analyze columns
ReadCSV csv = null;
try {
csv = new ReadCSV(input.toString(), headers, format);
if (!csv.next()) {
throw new QuantError("File is empty");
}
for (int i = 0; i < csv.getColumnCount(); i++) {
String name;
if (headers) {
name = attemptResolveName(csv.getColumnNames().get(i));
} else {
name = "Column-" + (i + 1);
}
// determine if it should be an input/output field
final String str = csv.get(i);
boolean io = false;
try {
Double.parseDouble(str);
io = true;
} catch (final NumberFormatException ex) {
EncogLogging.log(ex);
}
addColumn(new FileData(name, i, io, io));
}
} finally {
csv.close();
setAnalyzed(true);
}
}
/**
* Attempt to resolve a column name.
*
* @param name
* The unknown column name.
* @return The known column name.
*/
private String attemptResolveName(final String name) {
String name2 = name.toLowerCase();
if (name2.indexOf("open") != -1) {
return FileData.OPEN;
} else if (name2.indexOf("close") != -1) {
return FileData.CLOSE;
} else if (name2.indexOf("low") != -1) {
return FileData.LOW;
} else if (name2.indexOf("hi") != -1) {
return FileData.HIGH;
} else if (name2.indexOf("vol") != -1) {
return FileData.VOLUME;
} else if ((name2.indexOf("date") != -1)
|| (name.indexOf("yyyy") != -1)) {
return FileData.DATE;
} else if (name2.indexOf("time") != -1) {
return FileData.TIME;
}
return name;
}
/**
* Get the data for a specific column.
*
* @param name
* The column to read.
* @param csv
* The CSV file to read from.
* @return The column data.
*/
public String getColumnData(final String name, final ReadCSV csv) {
if (!this.columnMapping.containsKey(name)) {
return null;
}
final BaseCachedColumn column = this.columnMapping.get(name);
if (!(column instanceof FileData)) {
return null;
}
final FileData fd = (FileData) column;
return csv.get(fd.getIndex());
}
/**
* @return The column mappings.
*/
public Map<String, BaseCachedColumn> getColumnMapping() {
return this.columnMapping;
}
/**
* @return The columns.
*/
public List<BaseCachedColumn> getColumns() {
return this.columns;
}
}