阅读写得不好的csv

时间:2014-12-22 07:25:09

标签: java regex csv

我的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的最佳方法是创建一个匹配".."|".."字符串的正则表达式模式。

有人可以帮助我吗?

谢谢!

4 个答案:

答案 0 :(得分:1)

因为你的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
....

答案 1 :(得分:0)

\|(?=(?:[^"]*"[^"]*")*[^"]*$)

你可以用它来分割你的字符串。参见演示。

https://regex101.com/r/vN3sH3/48

答案 2 :(得分:0)

选择一位已经存在的CSV Library来处理此问题和其他问题。 CSV不是直接的&#34;逗号分隔&#34;所以没有必要重新发明轮子

答案 3 :(得分:-2)

使用此正则表达式["][|]["]进行简单的字符串拆分测试。

因此,您可以使用以下代码:row = line.split("[\"][|][\"]");

或者我的测试用简单的字符串拆分:

public static void main(String[] args) {
    String text = "\"xxx\"|\"yyy\"|\"zzz\"|\"nnn\"|\"....\"";
    String regex = "[\"][|][\"]";

    String[] textArray= text.split(regex);
    for(String part:textArray){
        System.out.println(part);
    }        
}

这将输出:

"xxx
yyy
zzz
nnn
...."

所以只需删除&#34;在开头和结尾,你有你的分裂字符串。

You can also test any regex on regex test websites.