在使用split 分离数据的时候,发现末尾空值被截断了
初始
public static void main(String args[]) {
String filePath = "中情局RSM01|||||1|121000000000012953730068|武清区||";
List<String> datas = Arrays.asList(filePath.split("\\|"));
System.out.println(datas.size() + " "+JSON.toJSONString(datas));
filePath = "中情局RSM02|||||2|121000000000000106661319|武清区||121000000000012953720761";
datas = Arrays.asList(filePath.split("\\|"));
System.out.println(datas.size() + " "+JSON.toJSONString(datas));
}
结果:
8 ["中情局RSM01","","","","","1","121000000000012953730068","武清区"]
10 ["中情局RSM02","","","","","2","121000000000000106661319","武清区","","121000000000012953720761"]
末尾为空的被截断了
处理
笨方法:
既然被截断了,那我尾巴加个空格,这样就都有值。
代码里面加个判断,如果尾巴是空的,再加个空格,分离后再进行替换。
public static void main(String args[]) {
String filePath = "中情局RSM01|||||1|121000000000012953730068|武清区||";
List<String> datas = splitData(filePath);
System.out.println(datas.size() + " "+JSON.toJSONString(datas));
filePath = "中情局RSM02|||||2|121000000000000106661319|武清区||121000000000012953720761";
datas = splitData(filePath);
System.out.println(datas.size() + " "+JSON.toJSONString(datas));
}
private static List<String> splitData(String str){
if(str.endsWith("|")){
str = str.concat(" "); // 设置为空,让对象读取到,最后分离后,再替换为空
List<String> data = new ArrayList<>(Arrays.asList(str.split("\\|")));
data.set(data.size() -1, "");
return data;
}
return Arrays.asList(str.split("\\|"));
}
结果:
10 ["中情局RSM01","","","","","1","121000000000012953730068","武清区","",""]
10 ["中情局RSM02","","","","","2","121000000000000106661319","武清区","","121000000000012953720761"]
符合目标。但是想想不对,在写这个方法的时候,肯定是有考虑到这情况的,去看看源码。
split(String regex, int limit)
把说明用谷歌翻译了下,
* 围绕给定的匹配拆分此字符串
* <a href="../util/regex/Pattern.html#sum">正则表达式</a>。
*
* <p> 此方法返回的数组包含此的每个子字符串
* 由与给定匹配的另一个子字符串终止的字符串
* 表达式 or 以字符串结尾结束。中的子串
* 数组按照它们在此字符串中出现的顺序排列。如果
* 表达式与输入的任何部分都不匹配,则结果数组
* 只有一个元素,即这个字符串。
*
* <p> 当此开头有正宽度匹配时
* string 然后在开头包含一个空的前导子字符串
* 结果数组。然而,开头的零宽度匹配
* 永远不会产生这样的空前导子字符串。
*
* <p> {@code limit} 参数控制的次数
* 模式被应用,因此会影响结果的长度
* 大批。如果限制 <i>n</i> 大于零,则模式
* 最多应用 <i>n</i> - 1 次,数组的
* 长度不会大于<i>n</i>,并且是数组的最后一项
* 将包含最后一个匹配分隔符之外的所有输入。如果 <i>n</i>
* 为非正数,则该模式将被应用多次
* 可能,并且数组可以有任意长度。如果 <i>n</i> 为零,则
* 模式会被应用尽可能多的次数,数组可以
* 具有任意长度,并且尾随的空字符串将被丢弃。
使用默认的split方法时,会默认丢弃字符串末尾的空值,而字符串中间的空值则会作为数组中的一项数据,不会被丢弃。
使用split(String regex, int limit),第二个参数limit,此值默认为0,丢弃末尾空数据。
而limit大于0时,代表分割字符串后数组的最大长度,当limit小于0时,代表获取数组所有值,不会丢弃末尾空值。
使用plit(String regex, int limit)
public static void main(String args[]) {
String filePath = "中情局RSM01|||||1|121000000000012953730068|武清区||";
List<String> datas = Arrays.asList(filePath.split("\\|", -1));
System.out.println(datas.size() + " "+JSON.toJSONString(datas));
filePath = "中情局RSM02|||||2|121000000000000106661319|武清区||";
datas = Arrays.asList(filePath.split("\\|", -2));
System.out.println(datas.size() + " "+JSON.toJSONString(datas));
}
结果:
10 ["中情局RSM01","","","","","1","121000000000012953730068","武清区","",""]
10 ["中情局RSM02","","","","","2","121000000000000106661319","武清区","",""]
总结:
使用split分离字符的时候,如果末尾有空值的,用split(String regex, int limit)。这上面也可以看出如果使用的方法不是自己想要的,先去看看源码,看看相关方法的实现,看看能不能满足需求,还不行,再考虑自己想法子去处理。