Excel导入时,外健往往只能用中文导入,在代码中,尝试用中文去匹配外建的id然后绑到要导入的数据中,这样一个,外健中文就必须和表里面的一模一样,但在实际中,导入的名称与表里存的名称总有少量字不同的差异,导致不能成功匹配到外健,如下所示:
导入数据Excel内容:
user_name office_id
张三 民主党派
office表数据:
1 民主党派管理部
用户表需正确存储的数据:
user_name office_id
张三 1
根据上面场景,作了下面这个经验外健匹配工具,原理也简单,算一下目标匹配字符与需要匹配字符串之间匹配的百分比,该方法较简单,存在误判率。需要手工校正。但整体还是可行的。在不同的项目中有过验证。也可以提高几个经验数字来提高匹配的准确率。具体使用可以视导入数据的重要程度、敏感程度等不同场景来决定。当然喽,也可直接新增一个外键数据,比如上面,再加一个民主党派的部门,缺点是会造成数据重复。这个就不提了。
java"> // sourceStr=民主党派领域--> targetStr=民主党派private boolean matchWithRate(String sourceStr, String targetStr) {// 有为空的,没有匹配的必要了if (ZYStrUtils.isAnyNull(sourceStr, targetStr)) {return false;}// 相等,直接匹配成功if (sourceStr.equals(targetStr)) {return true;}// 原字符太短了,失去匹配的意义,3是个经验长度if (sourceStr.length() < 3) {return false;}// 变成单个字符集合// [民,主,党,派]List<String> items = ZYStrUtils.strToChars(targetStr);int i = 0;for (String item : items) {// 原字段包含了单个字符if (sourceStr.contains(item)) {i++;}}if(i==0){return false;}// 计算匹配率BigDecimal beNum = new BigDecimal(items.size());BigDecimal num = new BigDecimal(i);BigDecimal num100 = new BigDecimal(100);BigDecimal divide = num.divide(beNum, BigDecimal.ROUND_HALF_DOWN, 2);BigDecimal multiply = divide.multiply(num100);double v = multiply.doubleValue();// 超过60%的匹配率,60也是个经验数字 如 民主党派领域--> 民主党派是匹配的return v > 60;}