annotate transform/CSVFeatureWriter.cpp @ 558:1d7ebc05157e

* Some fairly simplistic code to set up layer type properties based on RDF data about feature types (both when running transforms and when importing features from RDF files).
author Chris Cannam
date Thu, 12 Feb 2009 15:26:43 +0000
parents 6acdddf6f99e
children 4541581067f3
rev   line source
Chris@498 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@498 2
Chris@498 3 /*
Chris@498 4 Sonic Visualiser
Chris@498 5 An audio file viewer and annotation editor.
Chris@498 6
Chris@498 7 Sonic Annotator
Chris@498 8 A utility for batch feature extraction from audio files.
Chris@498 9
Chris@498 10 Mark Levy, Chris Sutton and Chris Cannam, Queen Mary, University of London.
Chris@498 11 Copyright 2007-2008 QMUL.
Chris@498 12
Chris@498 13 This program is free software; you can redistribute it and/or
Chris@498 14 modify it under the terms of the GNU General Public License as
Chris@498 15 published by the Free Software Foundation; either version 2 of the
Chris@498 16 License, or (at your option) any later version. See the file
Chris@498 17 COPYING included with this distribution for more information.
Chris@498 18 */
Chris@498 19
Chris@498 20 #include "CSVFeatureWriter.h"
Chris@498 21
Chris@498 22 #include <iostream>
Chris@498 23
Chris@498 24 #include <QRegExp>
Chris@498 25 #include <QTextStream>
Chris@498 26
Chris@498 27 using namespace std;
Chris@498 28 using namespace Vamp;
Chris@498 29
Chris@498 30 CSVFeatureWriter::CSVFeatureWriter() :
Chris@498 31 FileFeatureWriter(SupportOneFilePerTrackTransform |
Chris@498 32 SupportOneFileTotal,
Chris@498 33 "csv"),
Chris@498 34 m_separator(",")
Chris@498 35 {
Chris@498 36 }
Chris@498 37
Chris@498 38 CSVFeatureWriter::~CSVFeatureWriter()
Chris@498 39 {
Chris@498 40 }
Chris@498 41
Chris@498 42 CSVFeatureWriter::ParameterList
Chris@498 43 CSVFeatureWriter::getSupportedParameters() const
Chris@498 44 {
Chris@498 45 ParameterList pl = FileFeatureWriter::getSupportedParameters();
Chris@498 46 Parameter p;
Chris@498 47
Chris@498 48 p.name = "separator";
Chris@498 49 p.description = "Column separator for output. Default is \",\" (comma).";
Chris@498 50 p.hasArg = true;
Chris@498 51 pl.push_back(p);
Chris@498 52
Chris@498 53 return pl;
Chris@498 54 }
Chris@498 55
Chris@498 56 void
Chris@498 57 CSVFeatureWriter::setParameters(map<string, string> &params)
Chris@498 58 {
Chris@498 59 FileFeatureWriter::setParameters(params);
Chris@498 60
Chris@498 61 cerr << "CSVFeatureWriter::setParameters" << endl;
Chris@498 62 for (map<string, string>::iterator i = params.begin();
Chris@498 63 i != params.end(); ++i) {
Chris@498 64 cerr << i->first << " -> " << i->second << endl;
Chris@498 65 if (i->first == "separator") {
Chris@498 66 m_separator = i->second.c_str();
Chris@498 67 }
Chris@498 68 }
Chris@498 69 }
Chris@498 70
Chris@498 71 void
Chris@498 72 CSVFeatureWriter::write(QString trackId,
Chris@498 73 const Transform &transform,
Chris@498 74 const Plugin::OutputDescriptor& output,
Chris@498 75 const Plugin::FeatureList& features,
Chris@498 76 std::string summaryType)
Chris@498 77 {
Chris@498 78 // Select appropriate output file for our track/transform
Chris@498 79 // combination
Chris@498 80
Chris@498 81 QTextStream *sptr = getOutputStream(trackId, transform.getIdentifier());
Chris@498 82 if (!sptr) return; //!!! this is probably better handled with an exception
Chris@498 83
Chris@498 84 QTextStream &stream = *sptr;
Chris@498 85
Chris@498 86 for (unsigned int i = 0; i < features.size(); ++i) {
Chris@498 87
Chris@514 88 if (m_stdout || m_singleFileName != "") {
Chris@514 89 if (trackId != m_prevPrintedTrackId) {
Chris@514 90 stream << "\"" << trackId << "\"" << m_separator;
Chris@514 91 m_prevPrintedTrackId = trackId;
Chris@514 92 } else {
Chris@514 93 stream << m_separator;
Chris@514 94 }
Chris@514 95 }
Chris@514 96
Chris@498 97 QString timestamp = features[i].timestamp.toString().c_str();
Chris@498 98 timestamp.replace(QRegExp("^ +"), "");
Chris@514 99 stream << timestamp;
Chris@498 100
Chris@514 101 if (features[i].hasDuration) {
Chris@514 102 QString duration = features[i].duration.toString().c_str();
Chris@514 103 duration.replace(QRegExp("^ +"), "");
Chris@514 104 stream << m_separator << duration;
Chris@514 105 }
Chris@498 106
Chris@498 107 if (summaryType != "") {
Chris@498 108 stream << m_separator << summaryType.c_str();
Chris@498 109 }
Chris@498 110
Chris@498 111 for (unsigned int j = 0; j < features[i].values.size(); ++j) {
Chris@498 112 stream << m_separator << features[i].values[j];
Chris@498 113 }
Chris@498 114
Chris@514 115 if (features[i].label != "") {
Chris@514 116 stream << m_separator << "\"" << features[i].label.c_str() << "\"";
Chris@514 117 }
Chris@514 118
Chris@498 119 stream << "\n";
Chris@498 120 }
Chris@498 121 }
Chris@498 122
Chris@498 123