浏览代码

Tool to generate the OML TabularData instance file from a csv file.

Lucas Albertins 2 年之前
父节点
当前提交
988625cb12

+ 18 - 0
tools/oml-generators/pom.xml

@@ -0,0 +1,18 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>oml-generators</groupId>
+  <artifactId>oml-generators</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  
+  <dependencies>
+
+	<dependency>
+    <groupId>org.apache.commons</groupId>
+    <artifactId>commons-csv</artifactId>
+    <version>1.5</version>
+	</dependency>
+
+  </dependencies>
+  
+  
+</project>

+ 123 - 0
tools/oml-generators/src/main/java/csv/CSV2OML.java

@@ -0,0 +1,123 @@
+package csv;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.commons.csv.CSVFormat;
+import org.apache.commons.csv.CSVParser;
+import org.apache.commons.csv.CSVRecord;
+
+public class CSV2OML {
+
+	public static void generateOML(String tableName, String csvPath, String outputPath, String version, String iri) throws FileNotFoundException, IOException {
+		CSVParser parser;
+
+		String header = generateHeader(iri);
+
+		parser = new CSVParser(new FileReader(csvPath), CSVFormat.DEFAULT);
+		List<CSVRecord> list = parser.getRecords();
+		String table = "";
+		String headerRow = "";
+		StringBuilder rows = new StringBuilder();
+		StringBuilder cells = new StringBuilder();
+
+		table = generateTable(tableName, list, version, csvPath);
+
+		for (CSVRecord record : list) {
+
+			if (record.getRecordNumber() == 1) {
+				headerRow = generateRow(record, tableName, true);
+			} else {
+				rows.append(generateRow(record, tableName, false));
+			}
+
+			cells.append(generateCells(record, tableName));
+
+		}
+		parser.close();
+		StringBuilder content = new StringBuilder();
+		content.append(header);
+		content.append(table);
+		content.append(headerRow);
+		content.append(rows);
+		content.append(cells);
+		content.append("\n}");
+		FileWriter fw = new FileWriter(new File(outputPath));
+		fw.write(content.toString());
+		fw.close();
+	}
+
+	private static String generateHeader(String iri) {
+		StringBuilder sb = new StringBuilder();
+		sb.append("description " + iri + " as csv {\n");
+		sb.append("\tuses <http://ua.com.be/sdo2l/vocabulary/processtraces#> as traces\n");
+		sb.append("\tuses <http://ua.com.be/sdo2l/vocabulary/base/file#> as file\n");
+		sb.append("\tuses <http://ua.com.be/sdo2l/vocabulary/base/tabular#> as tabular\n\n");
+		return sb.toString();
+	}
+
+	private static String generateTable(String tableName, List<CSVRecord> list, String version, String cvsPath) {
+		StringBuilder sb = new StringBuilder();
+		StringBuilder rowList = new StringBuilder();
+		StringBuilder cellList = new StringBuilder();
+		sb.append("\tci " + tableName + " : tabular:TabularData [\n");
+		sb.append("\t\ttraces:hasVersion \"" + version + "\"\n");
+		sb.append("\t\tfile:isLocatedAt \"" + cvsPath + "\"\n");
+
+		for (CSVRecord record : list) {
+			rowList.append("\t\ttabular:hasRows " + tableName + "-row-" + (record.getRecordNumber() - 1) + "\n");
+			for (int i = 0; i < record.size(); i++) {
+				cellList.append("\t\ttabular:hasCells " + tableName + "-cell-" + (record.getRecordNumber() - 1) + "" + i
+						+ "\n");
+			}
+		}
+		sb.append(cellList);
+		sb.append(rowList);
+		sb.append("\t]\n");
+		sb.append("\n");
+		return sb.toString();
+	}
+
+	private static String generateCells(CSVRecord record, String tableName) {
+		StringBuilder sb = new StringBuilder();
+		for (int i = 0; i < record.size(); i++) {
+			sb.append("\tci " + tableName + "-cell-" + (record.getRecordNumber() - 1) + "" + i + " : tabular:Cell [\n");
+			sb.append("\t\ttabular:hasRowPosition " + (record.getRecordNumber() - 1) + "\n");
+			sb.append("\t\ttabular:hasColumnPosition " + i + "\n");
+			sb.append("\t\ttabular:holdsContent \"" + record.get(i) + "\"\n");
+			sb.append("\t\ttabular:isCellOfTabularData " + tableName + "\n");
+			sb.append("\t\ttabular:isInCollection " + tableName + "-row-" + (record.getRecordNumber() - 1) + "\n");
+			sb.append("\t]\n");
+		}
+
+		return sb.toString();
+	}
+
+	private static String generateRow(CSVRecord record, String tableName, boolean headerRow) {
+		StringBuilder sb = new StringBuilder();
+		sb.append("\tci " + tableName + "-row-" + (record.getRecordNumber() - 1) + " : tabular:"
+				+ (headerRow ? "HeaderRow" : "Row") + " [\n");
+		sb.append("\t\ttabular:hasRowId " + (record.getRecordNumber() - 1) + "\n");
+		sb.append("\t\ttabular:isRowOfTabularData " + tableName + "\n");
+
+		for (int i = 0; i < record.size(); i++) {
+			sb.append("\t\ttabular:hasCell " + tableName + "-cell-" + (record.getRecordNumber() - 1) + i + "\n");
+		}
+		sb.append("\t]\n");
+		return sb.toString();
+	}
+
+	public static void main(String[] args) throws FileNotFoundException, IOException {
+		generateOML("drivetrain-sensor-data", "src/main/resources/csv/sensor.csv", "target/sensor.oml", "0.0.1",
+				"<http://ua.com.be/sdo2l/description/drivetrain/artifacts#>");
+		generateOML("torque-profile", "src/main/resources/csv/profile.csv", "target/profile.oml", "0.0.1",
+				"<http://ua.com.be/sdo2l/description/drivetrain/artifacts#>");
+		generateOML("coupling-sensor-data", "src/main/resources/csv/coupling.csv", "target/coupling.oml", "0.0.1",
+				"<http://ua.com.be/sdo2l/description/drivetrain/artifacts#>");
+	}
+
+}

+ 10 - 0
tools/oml-generators/src/main/resources/csv/coupling.csv

@@ -0,0 +1,10 @@
+index,microsec,sense_00,sense_01,sense_02,sense_03,sense_10,sense_11,sense_12,sense_13
+0,100,0.3,0.6,0.1,0.3,0.3,0.1,0.3,0.5
+1,145,0.4,0.4,0.5,0.6,0.1,0.1,0.1,0.7
+2,246,0.1,0.2,0.6,0.7,0.1,0.2,0.2,0.5
+3,451,0.1,0.1,0.7,0.5,0.5,0.1,0.2,0.8
+4,564,0.2,0.1,0.9,0.4,0.4,0.3,0.4,0.9
+5,578,0.1,0.8,0.7,0.3,0.1,0.3,0.8,0.2
+6,612,0.2,0.4,0.7,0.2,0.2,0.1,0.1,0.1
+7,715,0.8,0.4,0.7,0.1,0.1,0.4,0.5,0.3
+8,788,0.1,0.1,0.4,0.5,0.1,0.1,0.1,0.1

+ 21 - 0
tools/oml-generators/src/main/resources/csv/profile.csv

@@ -0,0 +1,21 @@
+time,value
+1645343060000,0.1063435735
+1645799771000,0.1413462533
+1643731574000,0.0373289706
+1645534917000,0.1933671917
+1645881479000,-0.1221919282
+1644552154000,-0.1778075408
+1644171052000,-0.2688664202
+1643827663000,-0.1011829049
+1645673633000,-0.0463323214
+1645119377000,-0.2162654668
+1644038701000,0.2680340619
+1645058918000,-0.0288904173
+1643880041000,0.0804983286
+1645744877000,0.0828198062
+1645403668000,0.2368045351
+1645322842000,-0.3658627047
+1645305624000,-0.2719289020
+1645430775000,-0.1403125402
+1644767653000,-0.1142019323
+1644604915000,-0.0052879950

+ 10 - 0
tools/oml-generators/src/main/resources/csv/sensor.csv

@@ -0,0 +1,10 @@
+index,microsec,sense_00,sense_01,sense_02,sense_03,sense_10,sense_11,sense_12,sense_13
+0,100,0.3,0.6,0.1,0.3,0.3,0.1,0.3,0.5
+1,145,0.4,0.4,0.5,0.6,0.1,0.1,0.1,0.7
+2,246,0.1,0.2,0.6,0.7,0.1,0.2,0.2,0.5
+3,451,0.1,0.1,0.7,0.5,0.5,0.1,0.2,0.8
+4,564,0.2,0.1,0.9,0.4,0.4,0.3,0.4,0.9
+5,578,0.1,0.8,0.7,0.3,0.1,0.3,0.8,0.2
+6,612,0.2,0.4,0.7,0.2,0.2,0.1,0.1,0.1
+7,715,0.8,0.4,0.7,0.1,0.1,0.4,0.5,0.3
+8,788,0.1,0.1,0.4,0.5,0.1,0.1,0.1,0.1