public class Solution {
public static void main(String[] args) {
System.out.println(parseCSV(
"\"Kobe Bryant, 2020\",AAA, McDonald\"\"\"\"s, \"McDonald\"\"s\",\"\",asdf\"\"\"gh&$#^% \"\"sdfhjn,%$#^%\"\"\""));
System.out.println(parseCSV(
"\"Kobe Bryant, 2020\",AAA, McDonald\"\"\"\"s, \"McDonald\"\"s\",\"\",asdf\"\"\"gh&$#^% \"\"sdfhjn,%$#^%\"\"\""));
System.out.println(parseCSV(
"\"Kobe Bryant, 2020\",AAA, McDonald\"\"\"\"s, \"McDonald\"\"s\",\"\",asdf\"\"\"gh&$#^% \"\"sdfhjn,%$#^%\"\"\""));
}
public static String parseCSV(String str) {
List<String> list = new ArrayList<>();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); ++i) {
char c = str.charAt(i);
if (c == '"') {
Object[] ret = consumeCharsWithinQuotes(str, i + 1);
String withinQuotes = (String) ret[0];
i = (Integer) ret[1]; //returned position points to the ending quote
sb.append(withinQuotes);
} else if (c == ',') {
list.add(sb.toString());
sb.setLength(0);
} else {
sb.append(c);
}
}
//add the last item to list
list.add(sb.toString());
return String.join(" | ", list);
}
private static Object[] consumeCharsWithinQuotes(String str, int start) {
StringBuilder sb = new StringBuilder();
for (int i = start; i < str.length(); ++i) {
char c = str.charAt(i);
if (c == '"') {
if (i == str.length() - 1) {
//this is the ending quote
return new Object[]{sb.toString(), i};
}
char nextChar = str.charAt(i + 1);
if (nextChar == '"') {
//this is an escaped quote
sb.append('"');
++i;
} else {
//this is an internal ending quote
return new Object[]{sb.toString(), i};
}
} else {
sb.append(c);
}
}
return null;
}
}