X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2FCSVUtils.java;fp=src%2FCSVUtils.java;h=01d4e3241e6c613a341739befab130082b875fda;hb=ea1d42c94f53ccb6d17c2014589e12a273e7a7ee;hp=0000000000000000000000000000000000000000;hpb=d252f672e7ed73d9f4e588f855d20f042f2e2df8;p=Persons_Comparator.git diff --git a/src/CSVUtils.java b/src/CSVUtils.java new file mode 100644 index 0000000..01d4e32 --- /dev/null +++ b/src/CSVUtils.java @@ -0,0 +1,102 @@ +import java.util.ArrayList; +import java.util.List; + + +public class CSVUtils { + + private static final char DEFAULT_SEPARATOR = ','; + private static final char DEFAULT_QUOTE = '"'; + + public static List parseLine(String cvsLine) { + return parseLine(cvsLine, DEFAULT_SEPARATOR, DEFAULT_QUOTE); + } + + public static List parseLine(String cvsLine, char separators) { + return parseLine(cvsLine, separators, DEFAULT_QUOTE); + } + + public static List parseLine(String cvsLine, char separators, char customQuote) { + + List result = new ArrayList<>(); + + //if empty, return! + if (cvsLine == null && cvsLine.isEmpty()) { + return result; + } + + if (customQuote == ' ') { + customQuote = DEFAULT_QUOTE; + } + + if (separators == ' ') { + separators = DEFAULT_SEPARATOR; + } + + StringBuffer curVal = new StringBuffer(); + boolean inQuotes = false; + boolean startCollectChar = false; + boolean doubleQuotesInColumn = false; + + char[] chars = cvsLine.toCharArray(); + + for (char ch : chars) { + + if (inQuotes) { + startCollectChar = true; + if (ch == customQuote) { + inQuotes = false; + doubleQuotesInColumn = false; + } else { + + //Fixed : allow "" in custom quote enclosed + if (ch == '\"') { + if (!doubleQuotesInColumn) { + curVal.append(ch); + doubleQuotesInColumn = true; + } + } else { + curVal.append(ch); + } + + } + } else { + if (ch == customQuote) { + + inQuotes = true; + + //Fixed : allow "" in empty quote enclosed + if (chars[0] != '"' && customQuote == '\"') { + curVal.append('"'); + } + + //double quotes in column will hit this! + if (startCollectChar) { + curVal.append('"'); + } + + } else if (ch == separators) { + + result.add(curVal.toString()); + + curVal = new StringBuffer(); + startCollectChar = false; + + } else if (ch == '\r') { + //ignore LF characters + continue; + } else if (ch == '\n') { + //the end, break! + break; + } else { + curVal.append(ch); + } + } + + } + + result.add(curVal.toString()); + + return result; + } + +} \ No newline at end of file