3 #include <boost/tokenizer.hpp>
4 #include <boost/lexical_cast.hpp>
6 #include <Wt/WAbstractItemModel>
7 #include <Wt/WStandardItemModel>
8 #include <Wt/WStandardItem>
22 virtual void setData(
const boost::any &data,
int role = Wt::UserRole) {
25 if (role == Wt::EditRole) {
26 std::string s = Wt::asString(data).toUTF8();
29 double d = std::strtod(s.c_str(), &end);
37 Wt::WStandardItem::setData(dt, role);
41 Wt::WStandardItemModel *
csvToModel(
const std::string& csvFile,
43 bool firstLineIsHeaders)
45 std::ifstream f(csvFile.c_str());
48 Wt::WStandardItemModel *result =
new Wt::WStandardItemModel(0, 0, parent);
56 void readFromCsv(std::istream& f, Wt::WAbstractItemModel *model,
57 int numRows,
bool firstLineIsHeaders)
66 typedef boost::tokenizer<boost::escaped_list_separator<char> >
68 CsvTokenizer tok(line);
71 for (CsvTokenizer::iterator i = tok.begin();
72 i != tok.end(); ++i, ++col) {
74 if (col >= model->columnCount())
75 model->insertColumns(model->columnCount(),
76 col + 1 - model->columnCount());
78 if (firstLineIsHeaders && csvRow == 0)
79 model->setHeaderData(col, boost::any(Wt::WString::fromUTF8(*i)));
81 int dataRow = firstLineIsHeaders ? csvRow - 1 : csvRow;
83 if (numRows != -1 && dataRow >= numRows)
86 if (dataRow >= model->rowCount())
87 model->insertRows(model->rowCount(),
88 dataRow + 1 - model->rowCount());
90 boost::any data(Wt::WString::fromUTF8(*i));
91 model->setData(dataRow, col, data);