/ src / qt / csvmodelwriter.cpp
csvmodelwriter.cpp
 1  // Copyright (c) 2011-2018 The Bitcoin Core developers
 2  // Distributed under the MIT software license, see the accompanying
 3  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
 4  
 5  #include <qt/csvmodelwriter.h>
 6  
 7  #include <QAbstractItemModel>
 8  #include <QFile>
 9  #include <QTextStream>
10  
11  CSVModelWriter::CSVModelWriter(const QString& _filename, QObject* parent)
12      : QObject(parent),
13        filename(_filename)
14  {
15  }
16  
17  void CSVModelWriter::setModel(const QAbstractItemModel *_model)
18  {
19      this->model = _model;
20  }
21  
22  void CSVModelWriter::addColumn(const QString &title, int column, int role)
23  {
24      Column col;
25      col.title = title;
26      col.column = column;
27      col.role = role;
28  
29      columns.append(col);
30  }
31  
32  static void writeValue(QTextStream &f, const QString &value)
33  {
34      QString escaped = value;
35      escaped.replace('"', "\"\"");
36      f << "\"" << escaped << "\"";
37  }
38  
39  static void writeSep(QTextStream &f)
40  {
41      f << ",";
42  }
43  
44  static void writeNewline(QTextStream &f)
45  {
46      f << "\n";
47  }
48  
49  bool CSVModelWriter::write()
50  {
51      QFile file(filename);
52      if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
53          return false;
54      QTextStream out(&file);
55  
56      int numRows = 0;
57      if(model)
58      {
59          numRows = model->rowCount();
60      }
61  
62      // Header row
63      for(int i=0; i<columns.size(); ++i)
64      {
65          if(i!=0)
66          {
67              writeSep(out);
68          }
69          writeValue(out, columns[i].title);
70      }
71      writeNewline(out);
72  
73      // Data rows
74      for(int j=0; j<numRows; ++j)
75      {
76          for(int i=0; i<columns.size(); ++i)
77          {
78              if(i!=0)
79              {
80                  writeSep(out);
81              }
82              QVariant data = model->index(j, columns[i].column).data(columns[i].role);
83              writeValue(out, data.toString());
84          }
85          writeNewline(out);
86      }
87  
88      file.close();
89  
90      return file.error() == QFile::NoError;
91  }