Вот некоторый код для вас, я надеюсь, что использование кода отсюда не считается с открытым исходным кодом, который является.
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))));
}
}