Excel导入时,一个简单的匹配中文外键的方法
Excel导入时,外健往往只能用中文导入,在代码中,尝试用中文去匹配外建的id然后绑到要导入的数据中,这样一个,外健中文就必须和表里面的一模一样,但在实际中,导入的名称与表里存的名称总有少量字不同的差异,导致不能成功匹配到外健,如下所示:
导入数据Excel内容:
user_name office_id
张三 民主党派
office表数据:
1 民主党派管理部
用户表需正确存储的数据:
user_name office_id
张三 1
根据上面场景,作了下面这个经验外健匹配工具,原理也简单,算一下目标匹配字符与需要匹配字符串之间匹配的百分比,该方法较简单,存在误判率。需要手工校正。但整体还是可行的。在不同的项目中有过验证。也可以提高几个经验数字来提高匹配的准确率。具体使用可以视导入数据的重要程度、敏感程度等不同场景来决定。当然喽,也可直接新增一个外键数据,比如上面,再加一个民主党派的部门,缺点是会造成数据重复。这个就不提了。
// 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;
}