37static const QString NA = QStringLiteral(
"n/a");
39static QString valOrNA(
const QString& s)
41 return s.isEmpty() ? NA : s;
63 QList<BidsTsvRow> rows;
66 QFile file(sFilePath);
67 if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
68 qWarning() <<
"[BidsTsv::readTsv] Cannot open" << sFilePath;
72 QTextStream in(&file);
73 bool firstLine =
true;
76 QString line = in.readLine().trimmed();
80 QStringList fields = line.split(QLatin1Char(
'\t'));
89 for(
int i = 0; i < headers.size() && i < fields.size(); ++i) {
90 row[headers[i]] = fields[i];
102 const QStringList& headers,
103 const QList<BidsTsvRow>& rows)
105 QFile file(sFilePath);
106 if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
107 qWarning() <<
"[BidsTsv::writeTsv] Cannot open" << sFilePath <<
"for writing";
111 QTextStream out(&file);
114 out << headers.join(QLatin1Char(
'\t')) << QLatin1Char(
'\n');
117 for(
const auto& row : rows) {
119 fields.reserve(headers.size());
120 for(
const auto& header : headers) {
121 fields << valOrNA(row.value(header));
123 out << fields.join(QLatin1Char(
'\t')) << QLatin1Char(
'\n');
Generic tab-separated-value reader/writer for BIDS sidecars (UTF-8, LF, n/a for missing values,...
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)