我有一个写得不好的csv:
标头是:
"xxx"|"yyy"|"zzz"|"nnn"|"...."
所以我尝试的是创建一个扫描仪并在管道上拆分:
Scanner scanner = new Scanner(new File("myCsv.csv"));
int first = 1;
String line;
String row[];
while(scanner.hasNextLine()){
line = scanner.nextLine();
row = line.split("\\|");
if(first==1){
first = 0;
continue;
}
...
}
不幸的是,我在csv的一列中找到了新行,因此“ nextLine”不是获取整行的好方法。
另一个问题是管道存在于列中。类似:
"field1"|"field|2"|"field3\n"|"..."
因此,我认为解析csv的最佳方法是创建匹配
".."|".."
字符串的正则表达式模式。有没有人可以帮助我?
谢谢!
最佳答案
因为您的csv不包含任何转义的双引号,所以我建议您进行匹配而不是拆分。
"(?s)\".*?\""
(?s)
称为dotall修饰符,它可使图案中的点与偶数换行符匹配。DEMO
String s = "\"xxx\"|\"yyy|bar\"|\"zzz\"|\"nn\n" +
"n\"|\"....\"";
Matcher m = Pattern.compile("(?s)\".*?\"").matcher(s);
while(m.find())
{
System.out.println(m.group(0));
}
输出:
"xxx"
"yyy|bar"
"zzz"
"nn
n"
"...."
如果不想在最终输出中使用双引号,请使用捕获组。
String s = "\"xxx\"|\"yyy|bar\"|\"zzz\"|\"nn\n" +
"n\"|\"....\"";
Matcher m = Pattern.compile("(?s)\"(.*?)\"").matcher(s);
while(m.find())
{
System.out.println(m.group(1));
}
输出:
xxx
yyy|bar
zzz
nn
n
....