如何解析CSV而不捕获错误的分隔符?

时间:2016-03-17 22:26:32

标签: java regex csv

在我的程序中,我得到了一个庞大,庞大的csv String,我需要将其解析为数据表。数据是这样的:

["Email Address","First Name","Last Name","Phone #","Notes","Group"]
["email@email.com","First","Last","555-555-5555","Note",5]
["email2@email.com","First2","Last2","555-555-5555",null,3]

(要制作一个MVCE,你可以使用它:)

String text = "[\"Email Address\",\"First Name\",\"Last Name\",\"Phone #\",\"Notes\",\"Group\"]\n" +
    "[\"email@email.com\",\"First\",\"Last\",\"555-555-5555\",\"Note\",5]\n" +
    "[\"email2@email.com\",\"First2\",\"Last2\",\"555-555-5555\",null,3]";

第一行是表头,后面的行是值。每行都包含在[]中,值以逗号分隔。

我需要:

  1. 分隔线
  2. 分隔每个值
  3. 对于#1,我认为这种方法很好:

    Pattern eachLinePattern = Pattern.compile("\\[.*\\][\r\n]+");
    Matcher matcher = eachLinePattern.matcher(text);
    while (matcher.find()) {
        String line = matcher.group().trim();
    }
    

    此正则表达式将捕获.*[之间的所有内容(]),后跟\n\r,这应该足以捕获所有的线条(这听起来像一个声明,但这是一个问题。我错过了这个潜在的陷阱吗?)

    对于#2,这是我遇到困难的地方。有些项目是字符串(""),有些则不是(null,#s等)。

    我的第一个想法是使用逗号作为分隔符进行.split()

    Pattern eachLinePattern = Pattern.compile("\\[.*\\][\r\n]+");
    Matcher matcher = eachLinePattern.matcher(text);
    while (matcher.find()) {
        String line = matcher.group().trim();
        String[] eachItem = line.split(",");
        for(String item : eachItem)
            System.out.println(item);
    }
    

    但是,这也有明显的副作用,也就是在数据中捕获逗号。那么,我如何确保数据中的逗号不会被捕获为虚假分隔符?

1 个答案:

答案 0 :(得分:1)

你自己需要这样做吗? Apache Commons CSV库是我用于解析CSV文件的一个选项(有others)。在解析分隔文本时,有一些令人惊讶的极端案例,其他人已经比以往更好地完成了它。