在我的程序中,我得到了一个庞大,庞大的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,我认为这种方法很好:
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);
}
但是,这也有明显的副作用,也就是在数据中捕获逗号。那么,我如何确保数据中的逗号不会被捕获为虚假分隔符?
答案 0 :(得分:1)
你自己需要这样做吗? Apache Commons CSV库是我用于解析CSV文件的一个选项(有others)。在解析分隔文本时,有一些令人惊讶的极端案例,其他人已经比以往更好地完成了它。