diff --git a/src/main/java/edu/unl/cse/csv_io/CSVReaderWriter.java b/src/main/java/edu/unl/cse/csv_io/CSVReaderWriter.java new file mode 100644 index 0000000000000000000000000000000000000000..344b65ad00509cd02208f8c3bfcf244ccdf5bc2f --- /dev/null +++ b/src/main/java/edu/unl/cse/csv_io/CSVReaderWriter.java @@ -0,0 +1,72 @@ +/* + * CSV Reader/Writer, copyright (c) 2019 Christopher A. Bohn, bohn@unl.edu. + */ + + +package edu.unl.cse.csv_io; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.*; + +public class CSVReaderWriter { + // this does not (yet) handle data elements that include commas and/or are surrounded by quotation marks + // use of ClassLoader.getResourceAsStream inspired by https://www.mkyong.com/java/java-read-a-file-from-resources-folder/ + // use of Map inspired by Python's csv module + private static final String DELIMTER = ","; + private static final char BYTE_ORDER_MARK = '\ufeff'; + + public static Set<Map<String, String>> readCSV(String filename) { + Set<Map<String, String>> csvSet = null; + ClassLoader classLoader = CSVReaderWriter.class.getClassLoader(); + try(InputStream inputStream = classLoader.getResourceAsStream("csv/"+filename)) { + csvSet = parseCSV(inputStream); + } catch (IOException ioException) { + System.err.println("Error loading " + filename + ". " + ioException); + } + return csvSet; + } + + private static Set<Map<String, String>> parseCSV(InputStream inputStream) throws IOException { + Set<Map<String, String>> csvSet = new HashSet<>(); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + String line; + List<String> fieldNames = new ArrayList<>(); + boolean header = true; + while ((line = reader.readLine()) != null) { + String[] elements = line.split(DELIMTER); + if (header) { + if (elements[0].charAt(0) == BYTE_ORDER_MARK) { + elements[0] = elements[0].substring(1); // remove text-encoding character sometimes added by Excel + } + fieldNames.addAll(Arrays.asList(elements)); + header = false; + } else { + Map<String, String> row = new HashMap<>(); + int column = 0; + for (String element: elements) { + row.put(fieldNames.get(column++), element); + } + csvSet.add(row); + } + } + return csvSet; + } + + public static void main(String[] args) { + Set<Map<String, String>> demo = readCSV("demo.csv"); + Set<String> fieldNames = null; + for (Map<String, String> row: demo) { + if (fieldNames == null) { + fieldNames = row.keySet(); + } + for (String field: fieldNames) { + String value = row.get(field); + System.out.print(field + ":" + value + "\t"); + } + System.out.println(); + } + } +} diff --git a/src/main/resources/csv/demo.csv b/src/main/resources/csv/demo.csv new file mode 100644 index 0000000000000000000000000000000000000000..fd9504d05f001d24158c9a2526145cda071edd3e --- /dev/null +++ b/src/main/resources/csv/demo.csv @@ -0,0 +1,5 @@ +A, B, C, D +one,two,,three +four,,five,six +7,8,9, +,alpha,beta,gamma \ No newline at end of file