00001 #include "TextFileReader.hpp"
00002
00003 namespace aux = indii::ml::aux;
00004
00005 using namespace indii::ml::data;
00006
00007 TextFileReader::TextFileReader(std::istream* in) : Reader(in) {
00008 nextLine();
00009 }
00010
00011 TextFileReader::TextFileReader(const std::string& file) : Reader(file) {
00012 nextLine();
00013 }
00014
00015 TextFileReader::TextFileReader(std::istream* in, unsigned int col) :
00016 Reader(in, col) {
00017 nextLine();
00018 }
00019
00020 TextFileReader::TextFileReader(const std::string& file, unsigned int col) :
00021 Reader(file, col) {
00022 nextLine();
00023 }
00024
00025 TextFileReader::TextFileReader(std::istream* in,
00026 const std::vector<unsigned int>& cols) : Reader(in, cols) {
00027 nextLine();
00028 }
00029
00030 TextFileReader::TextFileReader(const std::string& file,
00031 const std::vector<unsigned int>& cols) : Reader(file, cols) {
00032 nextLine();
00033 }
00034
00035 TextFileReader::~TextFileReader() {
00036
00037 }
00038
00039 unsigned int TextFileReader::read(double* into) {
00040 if (in->eof()) {
00041 return 0;
00042 } else {
00043 if (cols.empty()) {
00044
00045 *into = values[nextIndex];
00046 nextIndex++;
00047 if (nextIndex >= values.size()) {
00048 nextLine();
00049 }
00050 } else {
00051
00052 *into = values[cols[nextIndex]];
00053 nextIndex++;
00054 if (nextIndex >= cols.size() || cols[nextIndex] > values.size()) {
00055 nextLine();
00056 }
00057 }
00058 return 1;
00059 }
00060 }
00061
00062 unsigned int TextFileReader::read(aux::vector* into) {
00063 double x;
00064 unsigned int i = 0;
00065 unsigned int size = into->size();
00066
00067 while (i < size && read(&x) > 0) {
00068 (*into)(i) = x;
00069 i++;
00070 }
00071 return i;
00072 }
00073
00074 unsigned int TextFileReader::read(aux::matrix* into) {
00075 double x;
00076 unsigned int numRead = 0;
00077 unsigned int i = 0, j = 0;
00078 unsigned int size1 = into->size1(), size2 = into->size2();
00079
00080 for (j = 0; j < size2; j++) {
00081 for (i = 0; i < size1 && read(&x) > 0; i++) {
00082 numRead++;
00083 (*into)(i,j) = x;
00084 }
00085 }
00086
00087 return numRead;
00088 }
00089
00090 unsigned int TextFileReader::read(aux::symmetric_matrix* into) {
00091 double x;
00092 unsigned int numRead = 0;
00093 unsigned int i, j;
00094 unsigned int size = into->size1();
00095 for (j = 0; j < size; j++) {
00096 for (i = j; i < size && read(&x) > 0; i++) {
00097 numRead++;
00098 (*into)(i,j) = x;
00099 }
00100 }
00101
00102 return numRead;
00103 }
00104
00105 void TextFileReader::nextLine() {
00106 double value;
00107 std::string line;
00108 std::stringstream lineStream;
00109
00110 nextIndex = 0;
00111 values.clear();
00112
00113 std::getline(*in, line);
00114 if (!in->eof()) {
00115
00116 lineStream.str(line);
00117 do {
00118 lineStream >> value;
00119 values.push_back(value);
00120 } while (!lineStream.eof());
00121 }
00122 }
00123