有没有办法在一些CSV解析器(例如SuperCSV)的帮助下解析CSV文件(可变列数)到List< String>的设置。没有在Java中跳过引号?输入:
id,name,text,sth
1,"John","Text with 'c,o,m,m,a,s' and \"",qwerty
2,Bob,"",,sth
解析后,我希望在集合中包含与输入相同的文本,而不是:
id,name,text,sth
1,John,Text with 'c,o,m,m,a,s' and \",qwerty
2,Bob,null,null,sth
该元素
"约翰"将被解析为字符串" John" (而不是约翰)
"" - > ""
,, - > ,null,
等
我已经写过关于here的内容了,但我可能还没有说明这一点。 我想将csv文件解析为List< String>的集合,对此做一些事情并打印到stdout,留下引号所在的位置。请帮帮我。
答案 0 :(得分:0)
这样的东西?不使用任何现有的解析器,从头开始:
public List<String> parse(String st) {
List<String> result = new ArrayList<String>();
boolean inText = false;
StringBuilder token = new StringBuilder();
char prevCh = 0;
for (int i = 0; i < st.length(); i++) {
char ch = st.charAt(i);
if (ch == ',' && !inText) {
result.add(token.toString());
token = new StringBuilder();
continue;
}
if (ch == '"' && inText) {
if (prevCh == '\\') {
token.deleteCharAt(token.length() - 1);
} else {
inText = false;
}
} else if (ch == '"' && !inText) {
inText = true;
}
token.append(ch);
prevCh = ch;
}
result.add(token.toString());
return result;
}
然后
String st = "1,\"John\",\"Text with 'c,o,m,m,a,s' and \\\"\",qwerty";
List<String> result = parse(st);
System.out.println(result);
将打印出来:
[1, "John", "Text with 'c,o,m,m,a,s' and "", qwerty]
答案 1 :(得分:0)
我用过这个: http://opencsv.sourceforge.net/
我对结果非常满意。我有一堆不同组织的CSV文件(有时这些人们称之为CSV的东西很有趣),我设法为它设置了阅读器。但是,我不认为它会产生逗号,但是如果有一个空字段,它会留下空白。由于您可以将整行作为数组获取,因此您可以迭代它并在每次迭代之间使用逗号。
查找设置,其中有一堆,包括引号字符。