Aquí hay un código para usted, 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<String> tokens = new ArrayList<String>(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<len-1 && line.charAt(i+1) == quote){//2xdouble quote in quoted
sb.append(c);
i++;//skip it
}else{
if (quoted){
//next symbol must be either separator or eol according to RFC 4180
if (i==len-1 || line.charAt(i+1) == separator){
quoted = false;
continue;
}
} else{//not quoted
if (sb.length()==0){//at the very start
quoted=true;
continue;
}
}
//if fall here, bogus, just add the quote and move on; or throw exception if you like to
/*
5. Each field may or may not be enclosed in double quotes (however
some programs, such as Microsoft Excel, do not use double quotes
at all). If fields are not enclosed with double quotes, then
double quotes may not appear inside the fields.
*/
sb.append(c);
}
} else if (c == separator && !quoted) {
tokens.add(sb.toString());
sb.setLength(0);
} else {
sb.append(c);
}
}
if (!quoted)
break;
}
tokens.add(sb.toString());//add last
if (expectedColumns !=null)
expectedColumns[0] = tokens.size();
return tokens.toArray(new String[tokens.size()]);
}
public static void main(String[] args) throws Throwable{
java.io.StringReader r = new java.io.StringReader("222,\"\"\"zzzz\", abc\"\" , 111 ,\"1\n2\n3\n\"");
System.out.println(java.util.Arrays.toString(splitCSV(new BufferedReader(r))));
}
}
No hay idea de que sea fácil, CSV tiene algunos casos de bordes fiddly: comillas de escape: utilizando varios estilos no menos; y nuevas líneas en los valores de campo: diversión si tiene que informar errores con la línea CSV en la que se produjeron. Si no puede usar un analizador existente y podría tener que lidiar con esto, escriba un analizador. (Lo cual también es divertido de hacer si no tiene permitido un generador de analizador.) – millimoose
si la compañía no solicita libs de código abierto {independientemente de la licencia) y necesita ayuda con un análisis simple ... – bestsss
@Inerdia, the El análisis es alrededor de 30 líneas de código escrito a mano, sin necesidad de generador. – bestsss