Parse CSV con comillas dobles en algunos casos

Tengo csv que viene con formato:

a1, a2, a3, “a4, a5”, a6

Solo el campo con, tendrá citas

Usando Java, ¿cómo analizar fácilmente esto? Intento evitar el uso del analizador de código abierto CSV como política de la compañía. Gracias.

Puede usar Matcher.find con la siguiente expresión regular:

 \ s * ("[^"] * "| [^,] *) \ s *

Aquí hay un ejemplo más completo:

 String s = "a1, a2, a3, \"a4,a5\", a6"; Pattern pattern = Pattern.compile("\\s*(\"[^\"]*\"|[^,]*)\\s*"); Matcher matcher = pattern.matcher(s); while (matcher.find()) { System.out.println(matcher.group(1)); } 

Véalo trabajar en línea: ideone

Me encontré con este mismo problema (pero en Python), una de las formas que encontré para resolverlo, sin expresiones regulares, fue: cuando obtienes la línea, busca cualquier cotización, si hay comillas, divide la cadena entre comillas, y divide el incluso resultados indexados de la matriz resultante en comas. Las cadenas indexadas impares deben ser los valores cotizados completos.

No soy un codificador de Java, así que toma esto como un seudocódigo …

 line = String[]; if ('"' in row){ vals = row.split('"'); for (int i =0; i 

Alternativamente, use una expresión regular.

Aquí hay un código para ti, espero que usar código fuera de aquí no cuente código abierto, que es.

 package bestsss.util; import java.io.BufferedReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class SplitCSVLine { public static String[] splitCSV(BufferedReader reader) throws IOException{ return splitCSV(reader, null, ',', '"'); } /** * * @param reader - some line enabled reader, we lazy * @param expectedColumns - convenient int[1] to return the expected * @param separator - the C(omma) SV (or alternative like semi-colon) * @param quote - double quote char ('"') or alternative * @return String[] containing the field * @throws IOException */ public static String[] splitCSV(BufferedReader reader, int[] expectedColumns, char separator, char quote) throws IOException{ final List tokens = new ArrayList(expectedColumns==null?8:expectedColumns[0]); final StringBuilder sb = new StringBuilder(24); for(boolean quoted=false;;sb.append('\n')) {//lazy, we do not preserve the original new line, but meh final String line = reader.readLine(); if (line==null) break; for (int i = 0, len= line.length(); i < len; i++) { final char c = line.charAt(i); if (c == quote) { if( quoted && i 

El siguiente código parece funcionar bien y puede manejar citas entre comillas.

 final static Pattern quote = Pattern.compile("^\\s*\"((?:[^\"]|(?:\"\"))*?)\"\\s*,"); public static List parseCsv(String line) throws Exception { List list = new ArrayList(); line += ","; for (int x = 0; x < line.length(); x++) { String s = line.substring(x); if (s.trim().startsWith("\"")) { Matcher m = quote.matcher(s); if (!m.find()) throw new Exception("CSV is malformed"); list.add(m.group(1).replace("\"\"", "\"")); x += m.end() - 1; } else { int y = s.indexOf(","); if (y == -1) throw new Exception("CSV is malformed"); list.add(s.substring(0, y)); x += y; } } return list; }