[PATCH 3/3] Parse txt formatted log files

Miika Turkia miika.turkia at gmail.com
Wed May 4 23:26:12 PDT 2016


This parses .txt log files produced by Dataplus and Oceanlog software.

Signed-off-by: Miika Turkia <miika.turkia at gmail.com>
---
 desktop-widgets/divelogimportdialog.cpp | 74 ++++++++++++++++++++++++++++++++-
 desktop-widgets/divelogimportdialog.h   |  2 +
 2 files changed, 74 insertions(+), 2 deletions(-)

diff --git a/desktop-widgets/divelogimportdialog.cpp b/desktop-widgets/divelogimportdialog.cpp
index c8402ab..0a964b0 100644
--- a/desktop-widgets/divelogimportdialog.cpp
+++ b/desktop-widgets/divelogimportdialog.cpp
@@ -342,6 +342,7 @@ DiveLogImportDialog::DiveLogImportDialog(QStringList fn, QWidget *parent) : QDia
 	column = 0;
 	delta = "0";
 	hw = "";
+	txtLog = false;
 
 	/* Add indexes of XSLTs requiring special handling to the list */
 	specialCSV << SENSUS;
@@ -489,8 +490,21 @@ void DiveLogImportDialog::loadFileContents(int value, whatChanged triggeredBy)
 		ui->knownImports->setCurrentText("DL7");
 		ui->CSVUnits->setCurrentText(units);
 		blockSignals(false);
+	} else if (firstLine.contains("Life Time Dive")) {
+		txtLog = true;
+
+		while ((firstLine = f.readLine().trimmed()).length() >= 0 && !f.atEnd()) {
+			if (firstLine.contains("Dive Profile")) {
+				f.readLine();
+				break;
+			}
+		}
+		firstLine = f.readLine().trimmed();
+
 	}
 
+
+
 	// Special handling for APD Log Viewer
 	if ((triggeredBy == KNOWNTYPES && (value == APD || value == APD2)) || (triggeredBy == INITIAL && fileNames.first().endsWith(".apd", Qt::CaseInsensitive))) {
 		apd=true;
@@ -694,6 +708,13 @@ void DiveLogImportDialog::loadFileContents(int value, whatChanged triggeredBy)
 				break;
 			}
 		}
+	} else if (txtLog) {
+		while ((firstLine = f.readLine().trimmed()).length() >= 0 && !f.atEnd()) {
+			if (firstLine.contains("Dive Profile")) {
+				firstLine = f.readLine().trimmed();
+				break;
+			}
+		}
 	}
 
 	while (rows < 10 && !f.atEnd()) {
@@ -768,6 +789,51 @@ int DiveLogImportDialog::setup_csv_params(QStringList r, char **params, int pnr)
 
 	return pnr;
 }
+int DiveLogImportDialog::parseTxtHeader(QString fileName, char **params, int pnr)
+{
+	QFile f(fileNames.first());
+	QString date;
+	QString time;
+	QString line;
+
+	f.open(QFile::ReadOnly);
+	while ((line = f.readLine().trimmed()).length() >= 0 && !f.atEnd()) {
+		if (line.contains("Dive Profile")) {
+			f.readLine();
+			break;
+		} else if (line.contains("Dive Date: ")) {
+			date = line.replace(QString::fromLatin1("Dive Date: "), QString::fromLatin1(""));
+
+			if (date.contains('-')) {
+				QStringList fmtDate = date.split('-');
+				date = fmtDate[0] + fmtDate[1] + fmtDate[2];
+			} else if (date.contains('/')) {
+				QStringList fmtDate = date.split('/');
+				date = fmtDate[2] + fmtDate[0] + fmtDate[1];
+			} else {
+				QStringList fmtDate = date.split('.');
+				date = fmtDate[2] + fmtDate[1] + fmtDate[0];
+			}
+		} else if (line.contains("Elapsed Dive Time: ")) {
+			// Skipping dive duration for now
+		} else if (line.contains("Dive Time: ")) {
+			time = line.replace(QString::fromLatin1("Dive Time: "), QString::fromLatin1(""));
+
+			if (time.contains(':')) {
+				QStringList fmtTime = time.split(':');
+				time = fmtTime[0] + fmtTime[1];
+
+			}
+		}
+	}
+	f.close();
+
+	params[pnr++] = strdup("date");
+	params[pnr++] = strdup(date.toLatin1());
+	params[pnr++] = strdup("time");
+	params[pnr++] = strdup(time.toLatin1());
+	return pnr;
+}
 
 void DiveLogImportDialog::on_buttonBox_accepted()
 {
@@ -832,7 +898,9 @@ void DiveLogImportDialog::on_buttonBox_accepted()
 				int pnr = 0;
 
 				QRegExp apdRe("^.*[/\\][0-9a-zA-Z]*_([0-9]{6})_([0-9]{6})\\.apd");
-				if (apdRe.exactMatch(fileNames[i])) {
+				if (txtLog) {
+					pnr = parseTxtHeader(fileNames[i], params, pnr);
+				} else if (apdRe.exactMatch(fileNames[i])) {
 					params[pnr++] = strdup("date");
 					params[pnr++] = strdup("20" + apdRe.cap(1).toLatin1());
 					params[pnr++] = strdup("time");
@@ -906,7 +974,9 @@ void DiveLogImportDialog::on_buttonBox_accepted()
 				int pnr = 0;
 
 				QRegExp apdRe("^.*[/\\][0-9a-zA-Z]*_([0-9]{6})_([0-9]{6})\\.apd");
-				if (apdRe.exactMatch(fileNames[i])) {
+				if (txtLog) {
+					pnr = parseTxtHeader(fileNames[i], params, pnr);
+				} else if (apdRe.exactMatch(fileNames[i])) {
 					params[pnr++] = strdup("date");
 					params[pnr++] = strdup("20" + apdRe.cap(1).toLatin1());
 					params[pnr++] = strdup("time");
diff --git a/desktop-widgets/divelogimportdialog.h b/desktop-widgets/divelogimportdialog.h
index 750bc10..8c75284 100644
--- a/desktop-widgets/divelogimportdialog.h
+++ b/desktop-widgets/divelogimportdialog.h
@@ -87,6 +87,7 @@ slots:
 	void loadFileContentsKnownTypesSelected(int value);
 	void loadFileContents(int value, enum whatChanged triggeredBy);
 	int setup_csv_params(QStringList r, char **params, int pnr);
+	int parseTxtHeader(QString fileName, char **params, int pnr);
 
 private:
 	bool selector;
@@ -97,6 +98,7 @@ private:
 	ColumnNameResult *resultModel;
 	QString delta;
 	QString hw;
+	bool txtLog;
 
 	struct CSVAppConfig {
 		QString name;
-- 
2.5.0



More information about the subsurface mailing list