00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
#include <plearn/io/fileutils.h>
00034
#include "StringTable.h"
00035
#include "stringutils.h"
00036
00037
00038
namespace PLearn {
00039
using namespace std;
00040
00041
00042 ostream&
operator<<(ostream& out,
const StringTable& st)
00043 {
00044
00045
TVec<size_t> colsiz(st.
width(),(size_t)0);
00046
for(
int j=0;j<st.
length();j++)
00047 {
00048
TVec<string> row=st.
data(j);
00049
for(
int i=0;i<st.
width();i++)
00050
if((size_t)row[i].
length() > colsiz[i])
00051 colsiz[i]=(size_t)row[i].
length();
00052 }
00053
for(
int i=0;i<st.
width();i++)
00054
if(st.
fieldnames[i].length() > colsiz[i])
00055 colsiz[i]=(size_t)st.
fieldnames[i].length();
00056
00057 out<<
"#: ";
00058
for(
int i=0;i<st.
width();i++)
00059 out<<
left(st.
fieldnames[i],colsiz[i]+3);
00060 out<<
"\n";
00061
00062
for(
int j=0;j<st.
length();j++)
00063 {
00064
TVec<string> row=st.
data(j);
00065 out<<
" ";
00066
for(
int i=0;i<st.
width();i++)
00067 out<<
left(row[i],colsiz[i])<<
";";
00068 out<<
"\n";
00069 }
00070
00071
return out;
00072
00073 }
00074
00075 void StringTable::appendRow(
const list<pair<string,string> > &row)
00076 {
00077
vector<string> vec;
00078
data.
resize(
data.
length()+1,
data.
width());
00079
int rownum=
data.
length()-1;
00080
for(list<pair<string,string> >::const_iterator it=row.begin();it!=row.end();++it)
00081 {
00082
int colnum;
00083 map<string,int>::iterator revit=
rev_fn.find(it->first);
00084
if(revit==
rev_fn.end())
00085 {
00086 colnum=
data.
width();
00087
TMat<string> tmp(
data.
length(),colnum+1);
00088 tmp.
subMatColumns(0,colnum)<<
data;
00089
data=tmp;
00090
rev_fn[it->first]=colnum;
00091
fieldnames.push_back(it->first);;
00092 }
00093
else colnum=
rev_fn[it->first];
00094
data(rownum,colnum)=it->second;
00095 }
00096 }
00097
00098
00099
00100
00101
00102 void StringTable::declareFields(
const list<pair<string,string> > & row)
00103 {
00104
for(list<pair<string,string> >::const_iterator it=row.begin();it!=row.end();++it)
00105 {
00106 map<string,int>::iterator revit=
rev_fn.find(it->first);
00107
if(revit==
rev_fn.end())
00108 {
00109
data.
resize(
data.
length(),
data.
width()+1);
00110
rev_fn[it->first]=
data.
width()-1;
00111
fieldnames.push_back(it->first);;
00112 }
00113 }
00114 }
00115
00116 StringTable::StringTable(){}
00117
00118 StringTable::StringTable(
const string & filename)
00119 {
00120
int nrows=
countNonBlankLinesOfFile(filename);
00121
string str;
00122 ifstream in(filename.c_str());
00123 in.ignore(2);
00124
if(in.peek()==
' ')
00125 in.ignore(1);
00126 getline(in,str);
00127
fieldnames=
split(str);
00128
data.
resize(nrows, (
int)
fieldnames.size());
00129
int rnum=0;
00130 getline(in,str);
00131
while(
removeblanks(str)!=
"")
00132 {
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
vector<string> line=
split(str,
";");
00146
00147
if(line.size()!=
fieldnames.size())
00148
PLERROR(
"in row %i : elements (%i) mismatch number of fields (%i)",rnum,line.size(),
fieldnames.size());
00149
00150
for(
unsigned int i= 0; i < line.size(); ++i)
00151
data(rnum,i)= line[i];
00152 ++rnum;
00153 getline(in,str);
00154 }
00155
data.
resize(rnum, (
int)
fieldnames.size());
00156 }
00157
00158
00159 }