+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