使用时存在严重问题
String[] strArr=line.split(",");
为了解析CSV文件,这是因为数据值中可能存在逗号,在这种情况下,您必须引用它们,并忽略引号之间的逗号。
有一种非常非常简单的方法来解析它:
/**
* returns a row of values as a list
* returns null if you are past the end of the input stream
*/
public static List<String> parseLine(Reader r) throws Exception {
int ch = r.read();
while (ch == '\r') {
//ignore linefeed chars wherever, particularly just before end of file
ch = r.read();
}
if (ch<0) {
return null;
}
Vector<String> store = new Vector<String>();
StringBuffer curVal = new StringBuffer();
boolean inquotes = false;
boolean started = false;
while (ch>=0) {
if (inquotes) {
started=true;
if (ch == '\"') {
inquotes = false;
}
else {
curVal.append((char)ch);
}
}
else {
if (ch == '\"') {
inquotes = true;
if (started) {
// if this is the second quote in a value, add a quote
// this is for the double quote in the middle of a value
curVal.append('\"');
}
}
else if (ch == ',') {
store.add(curVal.toString());
curVal = new StringBuffer();
started = false;
}
else if (ch == '\r') {
//ignore LF characters
}
else if (ch == '\n') {
//end of a line, break out
break;
}
else {
curVal.append((char)ch);
}
}
ch = r.read();
}
store.add(curVal.toString());
return store;
}
这种方法有很多优点。请注意,每个字符只接触一次。没有提前读取,在缓冲区中推回等。无需在行尾搜索,然后在解析之前复制该行。此解析器完全从流中工作,并创建每个字符串值一次。它适用于标题行和数据行,您只需处理适合该行的返回列表即可。您为它提供了一个读取器,因此基础流已使用您选择的任何编码转换为字符。流可以来自任何来源:文件,HTTP帖子,HTTP获取,您可以直接解析流。这是一个静态方法,因此没有要创建和配置的对象,并且当它返回时,没有保留内存。
您可以在我关于以下主题的博客文章中找到有关此代码的完整讨论,以及为什么首选此方法:CSV文件所需的唯一类。