59static const QString NA = QStringLiteral(
"n/a");
61static QString valOrNA(
const QString& s)
63 return s.isEmpty() ? NA : s;
85 QList<BidsTsvRow> rows;
88 QFile file(sFilePath);
89 if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
90 qWarning() <<
"[BidsTsv::readTsv] Cannot open" << sFilePath;
94 QTextStream in(&file);
95 bool firstLine =
true;
98 QString line = in.readLine().trimmed();
102 QStringList fields = line.split(QLatin1Char(
'\t'));
111 for(
int i = 0; i < headers.size() && i < fields.size(); ++i) {
112 row[headers[i]] = fields[i];
124 const QStringList& headers,
125 const QList<BidsTsvRow>& rows)
127 QFile file(sFilePath);
128 if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
129 qWarning() <<
"[BidsTsv::writeTsv] Cannot open" << sFilePath <<
"for writing";
133 QTextStream out(&file);
136 out << headers.join(QLatin1Char(
'\t')) << QLatin1Char(
'\n');
139 for(
const auto& row : rows) {
141 fields.reserve(headers.size());
142 for(
const auto& header : headers) {
143 fields << valOrNA(row.value(header));
145 out << fields.join(QLatin1Char(
'\t')) << QLatin1Char(
'\n');
BidsTsv class declaration — generic BIDS TSV file reading and writing.
BIDS dataset reading, writing, path construction, and sidecar metadata handling for iEEG/EEG/MEG.
QMap< QString, QString > BidsTsvRow
static QList< BidsTsvRow > readTsv(const QString &sFilePath, QStringList &headers)
static bool writeTsv(const QString &sFilePath, const QStringList &headers, const QList< BidsTsvRow > &rows)