Chris@392: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@392: Chris@392: /* Chris@392: Sonic Visualiser Chris@392: An audio file viewer and annotation editor. Chris@392: Centre for Digital Music, Queen Mary, University of London. Chris@392: This file copyright 2006 Chris Cannam. Chris@392: Chris@392: This program is free software; you can redistribute it and/or Chris@392: modify it under the terms of the GNU General Public License as Chris@392: published by the Free Software Foundation; either version 2 of the Chris@392: License, or (at your option) any later version. See the file Chris@392: COPYING included with this distribution for more information. Chris@392: */ Chris@392: Chris@392: #ifndef _CSV_FORMAT_H_ Chris@392: #define _CSV_FORMAT_H_ Chris@392: Chris@392: #include Chris@392: #include Chris@392: Chris@392: class CSVFormat Chris@392: { Chris@392: public: Chris@392: enum ModelType { Chris@392: OneDimensionalModel, Chris@392: TwoDimensionalModel, Chris@628: TwoDimensionalModelWithDuration, Chris@392: ThreeDimensionalModel Chris@392: }; Chris@392: Chris@392: enum TimingType { Chris@392: ExplicitTiming, Chris@392: ImplicitTiming Chris@392: }; Chris@628: Chris@392: enum TimeUnits { Chris@392: TimeSeconds, Chris@392: TimeAudioFrames, Chris@392: TimeWindows Chris@392: }; Chris@392: Chris@629: enum ColumnPurpose { Chris@629: ColumnUnknown, Chris@629: ColumnStartTime, Chris@629: ColumnEndTime, Chris@629: ColumnDuration, Chris@629: ColumnValue, Chris@629: ColumnLabel Chris@629: }; Chris@629: Chris@629: enum ColumnQuality { Chris@629: ColumnNumeric = 0x1, Chris@629: ColumnIntegral = 0x2, Chris@629: ColumnIncreasing = 0x4, Chris@629: ColumnLarge = 0x8 Chris@629: }; Chris@629: typedef unsigned int ColumnQualities; Chris@392: Chris@392: CSVFormat() : // arbitrary defaults Chris@392: m_modelType(TwoDimensionalModel), Chris@392: m_timingType(ExplicitTiming), Chris@392: m_timeUnits(TimeSeconds), Chris@392: m_separator(","), Chris@392: m_sampleRate(44100), Chris@392: m_windowSize(1024), Chris@629: m_columnCount(0), Chris@629: m_variableColumnCount(false), Chris@629: m_allowQuoting(true), Chris@629: m_maxExampleCols(0) Chris@392: { } Chris@629: Chris@629: CSVFormat(QString path); // guess format Chris@629: Chris@629: /** Chris@629: * Guess the format of the given CSV file, setting the fields in Chris@629: * this object accordingly. If the current separator is the empty Chris@629: * string, the separator character will also be guessed; otherwise Chris@629: * the current separator will be used. The other properties of Chris@629: * this object will be set according to guesses from the file. Chris@629: */ Chris@629: void guessFormatFor(QString path); Chris@628: Chris@628: ModelType getModelType() const { return m_modelType; } Chris@628: TimingType getTimingType() const { return m_timingType; } Chris@628: TimeUnits getTimeUnits() const { return m_timeUnits; } Chris@628: size_t getSampleRate() const { return m_sampleRate; } Chris@628: size_t getWindowSize() const { return m_windowSize; } Chris@630: int getColumnCount() const { return m_columnCount; } Chris@631: bool getAllowQuoting() const { return m_allowQuoting; } Chris@631: QChar getSeparator() const { Chris@631: if (m_separator == "") return ' '; Chris@631: else return m_separator[0]; Chris@631: } Chris@630: Chris@628: void setModelType(ModelType t) { m_modelType = t; } Chris@628: void setTimingType(TimingType t) { m_timingType = t; } Chris@628: void setTimeUnits(TimeUnits t) { m_timeUnits = t; } Chris@631: void setSeparator(QChar s) { m_separator = s; } Chris@628: void setSampleRate(size_t r) { m_sampleRate = r; } Chris@628: void setWindowSize(size_t s) { m_windowSize = s; } Chris@630: void setColumnCount(int c) { m_columnCount = c; } Chris@631: void setAllowQuoting(bool q) { m_allowQuoting = q; } Chris@392: Chris@631: QList getColumnPurposes() const { return m_columnPurposes; } Chris@629: void setColumnPurposes(QList cl) { m_columnPurposes = cl; } Chris@631: Chris@631: ColumnPurpose getColumnPurpose(int i); Chris@631: ColumnPurpose getColumnPurpose(int i) const; Chris@631: void setColumnPurpose(int i, ColumnPurpose p); Chris@392: Chris@629: // read-only; only valid if format has been guessed: Chris@629: QList getColumnQualities() const { return m_columnQualities; } Chris@629: Chris@629: // read-only; only valid if format has been guessed: Chris@392: QList getExample() const { return m_example; } Chris@392: int getMaxExampleCols() const { return m_maxExampleCols; } Chris@631: Chris@392: protected: Chris@628: ModelType m_modelType; Chris@628: TimingType m_timingType; Chris@628: TimeUnits m_timeUnits; Chris@628: QString m_separator; Chris@628: size_t m_sampleRate; Chris@628: size_t m_windowSize; Chris@392: Chris@629: int m_columnCount; Chris@629: bool m_variableColumnCount; Chris@629: Chris@629: QList m_columnQualities; Chris@629: QList m_columnPurposes; Chris@629: Chris@629: QList m_prevValues; Chris@629: Chris@629: bool m_allowQuoting; Chris@392: Chris@392: QList m_example; Chris@392: int m_maxExampleCols; Chris@629: Chris@629: void guessSeparator(QString line); Chris@629: void guessQualities(QString line, int lineno); Chris@629: void guessPurposes(); Chris@629: Chris@629: void guessFormatFor_Old(QString path); Chris@629: Chris@392: }; Chris@392: Chris@392: #endif