-1

有什么方法可以在一些 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" 将解析为字符串 "John" (而不是 John )

"" --> ""

,, --> ,null,

等等

我已经在这里写过这个,但我可能没有说得足够清楚。我想将 csv 文件解析为 List<String> 集,用它做一些事情并打印到标准输出,在它们所在的位置留下引号。请帮我。

4

2 回答 2

0

Something like this? Not using any existing parser, doing it from scratch:

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;
}

Then

String st = "1,\"John\",\"Text with 'c,o,m,m,a,s' and \\\"\",qwerty";

List<String> result = parse(st);
System.out.println(result);

Will print out:

[1, "John", "Text with 'c,o,m,m,a,s' and "", qwerty]
于 2014-04-11T12:13:53.623 回答
0

我用过这个: http: //opencsv.sourceforge.net/

我对结果非常满意。我有一堆不同组织的 CSV 文件(现在人们称之为 CSV 的东西有时很有趣),我设法为它设置了阅读器。但是,我认为它不会生成逗号,但它会在有空字段的地方留下空白。由于您可以将整行作为数组获取,因此您可以对其进行迭代,但每次迭代之间使用逗号。

查看设置,有一堆,包括引号字符。

于 2014-04-11T14:01:06.863 回答