public static List<String> parseCSV(String str) {
        List<String> res = new ArrayList<String>();
        boolean inQuote = false;
        StringBuilder buffer = new StringBuilder();
        for(int i = 0; i < str.length(); i++) {
            if(inQuote) {
                if(str.charAt(i) == '"') {
                    if(i == str.length() - 1) {
                        res.add(buffer.toString());
                        return res;
                    } else if(str.charAt(i + 1) == '"') {
                        buffer.append('"');
                        i++;
                    } else {
                        res.add(buffer.toString());
                        buffer.setLength(0);
                        inQuote = false;
                        i++;
                    }
                } else{
                    buffer.append(str.charAt(i));
                }
            } else {
                if(str.charAt(i) == '"') {
                    inQuote = true;
                } else if( str.charAt(i) == ',') {
                    res.add(buffer.toString());
                    buffer.setLength(0);
                } else {
                    buffer.append(str.charAt(i));
                }
            }
        }
        if(buffer.length() > 0) res.add(buffer.toString());
        return res;
    }