我有一个以下格式的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文件中可以重复文本字段内容中的双引号(例如“此帐户是”“大”“一”)
答案 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 %