关于Java Split命令解析Csv文件

时间:2010-02-11 02:04:56

标签: java csv split

我有一个以下格式的csv文件。

H,"TestItems_20100107.csv",07/01/2010,20:00:00,"TT1198","MOBb","AMD",NEW,,

我需要split命令忽略双引号内的逗号。所以我在之前的帖子中使用了下面的split命令。粘贴我使用此命令的URL

String items[] = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
System.out.println("items.length"+items.length);

Java: splitting a comma-separated string but ignoring commas in quotes

当我运行此CSV数据时,我将items.length打印为8.“NEW”之后的行尾的最后两个逗号将被忽略。我希望split命令能够获取这些逗号,然后将长度返回为10.如果它在最后,则不会拾取空逗号,但是如果它位于字符串的中间,它会将其拾取。不确定我需要在split命令中修改什么来解决此问题。同样在csv文件中可以重复文本字段内容中的双引号(例如“此帐户是”“大”“一”)

2 个答案:

答案 0 :(得分:9)

正则表达式没有错。问题是split在最后丢弃空匹配:

  

此方法就像通过调用一样工作   两个参数的分裂方法   给定表达式和限制参数   零。尾随空字符串   因此不包括在内   结果数组。

解决方法是提供一个大于CSV文件中所需列数的参数:

 String[] tokens = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", 99);

答案 1 :(得分:0)

我今天遇到了同样的问题,并为csv文件找到了一个简单的解决方案:在执行拆分时添加一个仅包含一个空格的字段:

(line + ", ").split(",");

这种方式无论csv文件末尾可能存在多少个连续的空字段,split()将始终返回n + 1个字段

示例会话(使用bsh)

bsh % line = "H,\"TestItems_20100107.csv\",07/01/2010,20:00:00,\"TT1198\",\"MOBb\",\"AMD\",NEW,,
bsh % System.out.println(line);
H,"TestItems_20100107.csv",07/01/2010,20:00:00,"TT1198","MOBb","AMD",NEW,,
bsh % String[] items = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
bsh % System.out.println(items.length);
8
bsh % items = (line + ", ").split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
bsh % System.out.println(items.length - 1 );
10
bsh %