#ifndef CSVBUILDER_H #define CSVBUILDER_H #include #include #include #include class CSVException : public std::exception { public: CSVException(const QString& text) : std::exception(), m_Message(text.toLocal8Bit()) {} virtual const char* what() const throw() { return m_Message.constData(); } private: QByteArray m_Message; }; class CSVBuilder { public: enum EFieldType { TYPE_INTEGER, TYPE_STRING, TYPE_FLOAT }; enum EQuoteMode { QUOTE_NEVER, QUOTE_ONDEMAND, QUOTE_ALWAYS }; enum ELineBreak { BREAK_LF, BREAK_CRLF, BREAK_CR }; public: CSVBuilder(QIODevice* target); ~CSVBuilder(); void setFieldSeparator(char sep); void setLineBreak(ELineBreak lineBreak); void setEscapeMode(EFieldType type, EQuoteMode mode); void setFields(const std::vector>& fields); void setDefault(const QString& field, const QVariant& value); void writeHeader(); void setRowField(const QString& field, const QVariant& value); void writeRow(); void addRow(const std::map& data); private: const char* lineBreak(); const char separator(); void fieldValid(); void checkFields(const std::vector& fields); void checkValue(const QString& field, const QVariant& value); void writeData(const std::map& data, bool check); void quoteInsert(QTextStream& stream, int value); void quoteInsert(QTextStream& stream, float value); void quoteInsert(QTextStream& stream, const QString& value); private: QTextStream m_Out; char m_Separator; ELineBreak m_LineBreak; std::map m_QuoteMode; std::vector m_Fields; std::map m_FieldTypes; std::map m_Defaults; std::map m_RowBuffer; }; #endif // CSVBUILDER_H