java - 读取写得不好的csv

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

有人可以帮助我吗?

谢谢!

最佳答案

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

关于java - 读取写得不好的csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27598273/

相关文章:

java - 导入的 java 类中的公共(public)静态最终变量

perl - 如何自动识别输入流的编码[csv文件]

powershell - 使用 powershell 合并多个 CSV 文件

java - 我正在尝试实现我自己的 HashSet,但我不知道 iterator() 方法应该返回什么?

java - 如何有效地在 Java 中对两个 TreeMap 求和?

ruby - 匹配词尾并且不是 "#"的正则表达式

regex - 正则表达式排除关键字集

vb.net - 将逗号添加到 CSV 文件 vb.net 而不打乱文件顺序

java - 如何在 Eclipse 中查找接口(interface)的所有实例?

java - 正则表达式中的 AND 运算符