package org.reldb.rel.v0.storage.relvars.external;
// Based on http://stackoverflow.com/questions/1757065/java-splitting-a-comma-separated-string-but-ignoring-commas-in-quotes
public class CSVLineParse {
private static final String otherThanQuote = " [^\"] ";
private static final String quotedString = String.format(" \" %s* \" ", otherThanQuote);
private static final String regex = String.format(
"(?x) "+ // enable comments, ignore white spaces
", "+ // match a comma
"(?= "+ // start positive look ahead
" (?: "+ // start non-capturing group 1
" %s* "+ // match 'otherThanQuote' zero or more times
" %s "+ // match 'quotedString'
" )* "+ // end group 1 and repeat it zero or more times
" %s* "+ // match 'otherThanQuote'
" $ "+ // match the end of the string
") ", // stop positive look ahead
otherThanQuote, quotedString, otherThanQuote);
public static String[] parseRaw(String line) {
return line.split(regex, -1);
}
public static String[] parse(String line) {
String[] parsed = parseRaw(line);
for (int i = 0; i < parsed.length; i++) {
String rawValue = parsed[i].trim();
if (rawValue.startsWith("\"") && rawValue.endsWith("\""))
parsed[i] = rawValue.substring(1, rawValue.length() - 1).replaceAll("\"\"", "\"");
}
return parsed;
}
public static String[] parseTrimmed(String line) {
String[] parsed = parse(line);
for (int i = 0; i < parsed.length; i++)
parsed[i] = parsed[i].trim();
return parsed;
}
}