【发布时间】:2016-05-23 04:18:27
【问题描述】:
我正在编写一个从标准输入读取 CSV 的 Java 应用程序。但是,我发现我在处理双引号时遇到了一些麻烦。
例如,如果我读到一个文本:
"He said, ""What?"""
输出给了我:
field[0] = `He said, What?"""'
最后两个引号是我不想要的。
这是我的代码:
public class Csv{
private BufferedReader fin;
private String fieldsep;
private ArrayList field;
public Csv(){
this(System.in, ",");
}
public Csv(InputStream in, String sep){
this.fin = new BufferedReader(new InputStreamReader(in));
this.fieldsep = sep;
}
// getline: get one line, grow as needed
public String getline() throws IOException {
String line;
line = fin.readLine();
if (line == null)
return null;
field = split(line, fieldsep);
return line;
}
// split: split line into fields
private static ArrayList split(String line, String sep){
ArrayList list = new ArrayList();
int i, j;
if (line.length() == 0)
return list;
i = 0;
do {
if (i < line.length() && line.charAt(i) == '"') {
StringBuffer field = new StringBuffer();
j = advquoted(line, ++i, sep, field);
list.add(field.toString());
}
else {
j = line.indexOf(sep, i);
if (j == -1)
j = line.length();
list.add(line.substring(i, j));
}
i = j + sep.length();
} while (j < line.length());
return list;
}
// advquoted: quoted field; return index of next separator
private static int advquoted(String s, int i, String sep, StringBuffer field){
field.setLength(0);
for ( ; i < s.length(); i++) {
if (s.charAt(i) == '"' && ++i < s.length() && s.charAt(++i) != '"') {
int j = s.indexOf(sep, i);
if (j == -1)
j = s.length();
field.append(s.substring(i, j));
i = j;
break;
}
field.append(s.charAt(i));
}
return i;
}
【问题讨论】:
-
我不确定,但对我来说很难通过你的代码。看来你已经解决了这个问题很尴尬。要从 CSV 中获取值,您可以使用例如 StringTokenizer 请参阅docs.oracle.com/javase/7/docs/api/java/util/…
-
最后一个逗号是什么意思?
-
The last two commas are what I don't want....你的意思是最后两个引号不是你想要的吗? -
您知道已经有很好的 CSV 库可用吗?你有什么理由需要自己写吗?
-
是的,应该是引号。这是我作业的一部分。我只是想制作自己的 cvs 类。