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