Java:CSV解析器 - 跳过引号

时间:2014-04-11 11:43:20

标签: java parsing csv quotes supercsv

有没有办法在一些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,留下引号所在的位置。请帮帮我。

2 个答案:

答案 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的东西很有趣),我设法为它设置了阅读器。但是,我不认为它会产生逗号,但是如果有一个空字段,它会留下空白。由于您可以将整行作为数组获取,因此您可以迭代它并在每次迭代之间使用逗号。

查找设置,其中有一堆,包括引号字符。