annotate data/fileio/CSVFormat.h @ 661:a4faa1840384

* If a FileSource URL won't convert at all in strict mode, try again in tolerant mode (necessary for e.g. filenames with square brackets in them)
author Chris Cannam
date Tue, 19 Oct 2010 21:47:55 +0100
parents 3a5ee4b6c9ad
children 69cc0454ed72
rev   line source
Chris@392 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@392 2
Chris@392 3 /*
Chris@392 4 Sonic Visualiser
Chris@392 5 An audio file viewer and annotation editor.
Chris@392 6 Centre for Digital Music, Queen Mary, University of London.
Chris@392 7 This file copyright 2006 Chris Cannam.
Chris@392 8
Chris@392 9 This program is free software; you can redistribute it and/or
Chris@392 10 modify it under the terms of the GNU General Public License as
Chris@392 11 published by the Free Software Foundation; either version 2 of the
Chris@392 12 License, or (at your option) any later version. See the file
Chris@392 13 COPYING included with this distribution for more information.
Chris@392 14 */
Chris@392 15
Chris@392 16 #ifndef _CSV_FORMAT_H_
Chris@392 17 #define _CSV_FORMAT_H_
Chris@392 18
Chris@392 19 #include <QString>
Chris@392 20 #include <QStringList>
Chris@392 21
Chris@392 22 class CSVFormat
Chris@392 23 {
Chris@392 24 public:
Chris@392 25 enum ModelType {
Chris@392 26 OneDimensionalModel,
Chris@392 27 TwoDimensionalModel,
Chris@628 28 TwoDimensionalModelWithDuration,
Chris@392 29 ThreeDimensionalModel
Chris@392 30 };
Chris@392 31
Chris@392 32 enum TimingType {
Chris@392 33 ExplicitTiming,
Chris@392 34 ImplicitTiming
Chris@392 35 };
Chris@628 36
Chris@392 37 enum TimeUnits {
Chris@392 38 TimeSeconds,
Chris@392 39 TimeAudioFrames,
Chris@392 40 TimeWindows
Chris@392 41 };
Chris@392 42
Chris@629 43 enum ColumnPurpose {
Chris@629 44 ColumnUnknown,
Chris@629 45 ColumnStartTime,
Chris@629 46 ColumnEndTime,
Chris@629 47 ColumnDuration,
Chris@629 48 ColumnValue,
Chris@629 49 ColumnLabel
Chris@629 50 };
Chris@629 51
Chris@629 52 enum ColumnQuality {
Chris@629 53 ColumnNumeric = 0x1,
Chris@629 54 ColumnIntegral = 0x2,
Chris@629 55 ColumnIncreasing = 0x4,
Chris@629 56 ColumnLarge = 0x8
Chris@629 57 };
Chris@629 58 typedef unsigned int ColumnQualities;
Chris@392 59
Chris@392 60 CSVFormat() : // arbitrary defaults
Chris@392 61 m_modelType(TwoDimensionalModel),
Chris@392 62 m_timingType(ExplicitTiming),
Chris@392 63 m_timeUnits(TimeSeconds),
Chris@392 64 m_separator(","),
Chris@392 65 m_sampleRate(44100),
Chris@392 66 m_windowSize(1024),
Chris@629 67 m_columnCount(0),
Chris@629 68 m_variableColumnCount(false),
Chris@629 69 m_allowQuoting(true),
Chris@629 70 m_maxExampleCols(0)
Chris@392 71 { }
Chris@629 72
Chris@629 73 CSVFormat(QString path); // guess format
Chris@629 74
Chris@629 75 /**
Chris@629 76 * Guess the format of the given CSV file, setting the fields in
Chris@629 77 * this object accordingly. If the current separator is the empty
Chris@629 78 * string, the separator character will also be guessed; otherwise
Chris@629 79 * the current separator will be used. The other properties of
Chris@629 80 * this object will be set according to guesses from the file.
Chris@629 81 */
Chris@629 82 void guessFormatFor(QString path);
Chris@628 83
Chris@628 84 ModelType getModelType() const { return m_modelType; }
Chris@628 85 TimingType getTimingType() const { return m_timingType; }
Chris@628 86 TimeUnits getTimeUnits() const { return m_timeUnits; }
Chris@628 87 size_t getSampleRate() const { return m_sampleRate; }
Chris@628 88 size_t getWindowSize() const { return m_windowSize; }
Chris@630 89 int getColumnCount() const { return m_columnCount; }
Chris@631 90 bool getAllowQuoting() const { return m_allowQuoting; }
Chris@631 91 QChar getSeparator() const {
Chris@631 92 if (m_separator == "") return ' ';
Chris@631 93 else return m_separator[0];
Chris@631 94 }
Chris@630 95
Chris@628 96 void setModelType(ModelType t) { m_modelType = t; }
Chris@628 97 void setTimingType(TimingType t) { m_timingType = t; }
Chris@628 98 void setTimeUnits(TimeUnits t) { m_timeUnits = t; }
Chris@631 99 void setSeparator(QChar s) { m_separator = s; }
Chris@628 100 void setSampleRate(size_t r) { m_sampleRate = r; }
Chris@628 101 void setWindowSize(size_t s) { m_windowSize = s; }
Chris@630 102 void setColumnCount(int c) { m_columnCount = c; }
Chris@631 103 void setAllowQuoting(bool q) { m_allowQuoting = q; }
Chris@392 104
Chris@631 105 QList<ColumnPurpose> getColumnPurposes() const { return m_columnPurposes; }
Chris@629 106 void setColumnPurposes(QList<ColumnPurpose> cl) { m_columnPurposes = cl; }
Chris@631 107
Chris@631 108 ColumnPurpose getColumnPurpose(int i);
Chris@631 109 ColumnPurpose getColumnPurpose(int i) const;
Chris@631 110 void setColumnPurpose(int i, ColumnPurpose p);
Chris@392 111
Chris@629 112 // read-only; only valid if format has been guessed:
Chris@629 113 QList<ColumnQualities> getColumnQualities() const { return m_columnQualities; }
Chris@629 114
Chris@629 115 // read-only; only valid if format has been guessed:
Chris@392 116 QList<QStringList> getExample() const { return m_example; }
Chris@392 117 int getMaxExampleCols() const { return m_maxExampleCols; }
Chris@631 118
Chris@392 119 protected:
Chris@628 120 ModelType m_modelType;
Chris@628 121 TimingType m_timingType;
Chris@628 122 TimeUnits m_timeUnits;
Chris@628 123 QString m_separator;
Chris@628 124 size_t m_sampleRate;
Chris@628 125 size_t m_windowSize;
Chris@392 126
Chris@629 127 int m_columnCount;
Chris@629 128 bool m_variableColumnCount;
Chris@629 129
Chris@629 130 QList<ColumnQualities> m_columnQualities;
Chris@629 131 QList<ColumnPurpose> m_columnPurposes;
Chris@629 132
Chris@629 133 QList<float> m_prevValues;
Chris@629 134
Chris@629 135 bool m_allowQuoting;
Chris@392 136
Chris@392 137 QList<QStringList> m_example;
Chris@392 138 int m_maxExampleCols;
Chris@629 139
Chris@629 140 void guessSeparator(QString line);
Chris@629 141 void guessQualities(QString line, int lineno);
Chris@629 142 void guessPurposes();
Chris@629 143
Chris@629 144 void guessFormatFor_Old(QString path);
Chris@629 145
Chris@392 146 };
Chris@392 147
Chris@392 148 #endif