我有一个写得不好的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
....

07-24 09:49
查看更多