]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.imports/src/org/simantics/district/imports/DistrictImportUtils.java
Adding basic import utilities - WIP!
[simantics/district.git] / org.simantics.district.imports / src / org / simantics / district / imports / DistrictImportUtils.java
diff --git a/org.simantics.district.imports/src/org/simantics/district/imports/DistrictImportUtils.java b/org.simantics.district.imports/src/org/simantics/district/imports/DistrictImportUtils.java
new file mode 100644 (file)
index 0000000..7c0d998
--- /dev/null
@@ -0,0 +1,156 @@
+package org.simantics.district.imports;\r
+\r
+import java.io.IOException;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.apache.commons.csv.CSVFormat;\r
+import org.apache.commons.csv.CSVParser;\r
+import org.apache.commons.csv.CSVRecord;\r
+import org.simantics.db.Resource;\r
+\r
+public class DistrictImportUtils {\r
+\r
+    private DistrictImportUtils() { }\r
+    \r
+    \r
+    public static Resource importCSVAsLayer(Path csvFile) throws IOException {\r
+        \r
+        \r
+        try (CSVParser parser = CSVFormat.DEFAULT.withFirstRecordAsHeader().parse(Files.newBufferedReader(csvFile))) {\r
+            Map<String, Integer> header = parser.getHeaderMap();\r
+            System.out.println(header);\r
+        }\r
+        return null;\r
+    }\r
+    \r
+    public static Map<String, Integer> readCSVHeader(Path source, char delimiter, boolean firstAsHeader) throws IOException {\r
+        return readCSVHeader(source, CSVFormat.newFormat(delimiter), firstAsHeader);\r
+    }\r
+    \r
+    public static Map<String, Integer> readCSVHeader(Path source, CSVFormat format, boolean firstAsHeader) throws IOException {\r
+        if (firstAsHeader)\r
+            format = format.withFirstRecordAsHeader();\r
+        try (CSVParser parser = format.parse(Files.newBufferedReader(source))) {\r
+            return parser.getHeaderMap();\r
+        }\r
+    }\r
+\r
+\r
+    public static Map<String, Character> getSupportedCSVDelimiterFormats() {\r
+        Map<String, Character> delimiters = new HashMap<>();\r
+        delimiters.put("COMMA", ',');\r
+        delimiters.put("SEMICOMMA", ';');\r
+        return delimiters;\r
+    }\r
+\r
+    public static List<Map<String, String>> readRows(Path source, char delimiter, boolean firstAsHeader, int amount) throws IOException {\r
+        return readRows(source, CSVFormat.newFormat(delimiter), firstAsHeader, amount);\r
+    }\r
+\r
+    public static List<Map<String, String>> readRows(Path source, CSVFormat format, boolean firstAsHeader, int amount) throws IOException {\r
+        if (firstAsHeader)\r
+            format = format.withFirstRecordAsHeader();\r
+        try (CSVParser parser = format.parse(Files.newBufferedReader(source))) {\r
+            int start = 0;\r
+            List<Map<String, String>> results = new ArrayList<>(amount);\r
+            Iterator<CSVRecord> iter = parser.iterator();\r
+            while (start < amount && iter.hasNext()) {\r
+                CSVRecord record = iter.next();\r
+                results.add(record.toMap());\r
+                start++;\r
+            }\r
+            return results;\r
+        }\r
+    }\r
+\r
+\r
+    public static Map<CSVHeader, List<String>> readCSVHeaderAndRows(Path source, char delimiter, boolean firstAsHeader, int amount) throws IOException {\r
+        Map<CSVHeader, List<String>> results = new HashMap<>();\r
+        CSVFormat format = CSVFormat.newFormat(delimiter);\r
+        if (firstAsHeader)\r
+            format = format.withFirstRecordAsHeader();\r
+        try (CSVParser parser = format.parse(Files.newBufferedReader(source))) {\r
+            Map<String, Integer> headers = parser.getHeaderMap();\r
+            if (headers != null && !headers.isEmpty()) {\r
+                for (int index = 0; index < headers.size(); index++) {\r
+                    for (String head : headers.keySet()) {\r
+                        results.put(new CSVHeader(head, index), new ArrayList<>());\r
+                    }\r
+                }\r
+            }\r
+            \r
+            Iterator<CSVRecord> records = parser.iterator();\r
+            int rows = 0;\r
+            while (rows < amount && records.hasNext()) {\r
+                CSVRecord record = records.next();\r
+                for (int j = 0; j < record.size(); j++) {\r
+                    String value = record.get(j);\r
+                    String header = Integer.toString(j);\r
+                    CSVHeader csvHeader = new CSVHeader(header, j);\r
+                    List<String> vals = results.get(csvHeader);\r
+                    if (vals == null) {\r
+                        vals = new ArrayList<>();\r
+                        results.put(csvHeader, vals);\r
+                    }\r
+                    vals.add(value);\r
+                }\r
+                rows++;\r
+            }\r
+        }\r
+        return results;\r
+    }\r
+    \r
+    public static class CSVHeader {\r
+\r
+        private final String header;\r
+        private final int index;\r
+        \r
+        public CSVHeader(String header, int index) {\r
+            this.header = header;\r
+            this.index = index;\r
+        }\r
+\r
+        public String getHeader() {\r
+            return header;\r
+        }\r
+\r
+        public int getIndex() {\r
+            return index;\r
+        }\r
+        \r
+        @Override\r
+        public int hashCode() {\r
+            final int prime = 31;\r
+            int result = 1;\r
+            result = prime * result + ((header == null) ? 0 : header.hashCode());\r
+            result = prime * result + index;\r
+            return result;\r
+        }\r
+\r
+        @Override\r
+        public boolean equals(Object obj) {\r
+            if (this == obj)\r
+                return true;\r
+            if (obj == null)\r
+                return false;\r
+            if (getClass() != obj.getClass())\r
+                return false;\r
+            CSVHeader other = (CSVHeader) obj;\r
+            if (header == null) {\r
+                if (other.header != null)\r
+                    return false;\r
+            } else if (!header.equals(other.header))\r
+                return false;\r
+            if (index != other.index)\r
+                return false;\r
+            return true;\r
+        }\r
+    }\r
+\r
+}\r