如何校验第一张表的文件名更换扩展名后是否存在于第二张表
实现逻辑
- 核心是先统一两张表的文件名格式:将第一张表文件名末尾的
.error后缀替换为.tm,再和第二张表的文件名列做存在性匹配即可 - 注意不要直接做全局字符串替换,要只处理末尾的后缀,避免文件名本身包含
.error字符时出现匹配错误
具体实现方案
方案1:数据库内直接用SQL查询(推荐,无需导出数据)
假设第一张表名为table_err,文件名列名为filename,存储值格式为xxx.error;第二张表名为table_tm,文件名列名为filename,存储值格式为xxx.tm。
通用兼容写法(所有支持标准SQL的数据库都可用)
通过截取固定长度后缀再拼接的方式实现格式转换,不会误替换文件名中间的字符:
SELECT a.filename AS error_filename, CONCAT(LEFT(a.filename, CHAR_LENGTH(a.filename) - 6), '.tm') AS expect_tm_filename, CASE WHEN b.filename IS NOT NULL THEN '存在' ELSE '不存在' END AS match_result FROM table_err a LEFT JOIN table_tm b ON CONCAT(LEFT(a.filename, CHAR_LENGTH(a.filename) - 6), '.tm') = b.filename;
说明:
.error后缀固定长度为6个字符,因此截取文件名从开头到倒数第7位的部分,再拼接.tm即可得到准确的目标文件名。
各数据库简化写法
- MySQL:可以直接用
REPLACE配合EXISTS判断,写法更简洁
SELECT filename, EXISTS(SELECT 1 FROM table_tm b WHERE b.filename = REPLACE(a.filename, '.error', '.tm')) AS is_exist FROM table_err a;
- PostgreSQL:支持
REGEXP_REPLACE精准匹配末尾后缀,更灵活
SELECT filename, EXISTS( SELECT 1 FROM table_tm b WHERE b.filename = REGEXP_REPLACE(a.filename, '\.error$', '.tm') ) AS is_exist FROM table_err a;
方案2:本地处理导出的表格文件(CSV/Excel)
如果数据表已经导出为本地文件,可以用Python的pandas库快速处理:
import pandas as pd # 读取两张表,根据实际文件格式切换read_excel/read_csv即可 df_err = pd.read_excel("错误文件列表.xlsx") df_tm = pd.read_excel("tm文件列表.xlsx") # 仅替换末尾的.error后缀为.tm df_err["tm_filename"] = df_err["filename"].str.removesuffix(".error") + ".tm" # 判断转换后的文件名是否在第二张表的文件名列表中 df_err["match_status"] = df_err["tm_filename"].isin(df_tm["filename"]) # 保存匹配结果 df_err.to_excel("匹配结果.xlsx", index=False)
注意:
removesuffix方法要求Python版本3.9及以上,低版本可以用正则替换df_err["filename"].str.replace(r'\.error$', '.tm', regex=True)实现相同效果。
内容的提问来源于stack exchange,提问作者aami123
相关产品推荐
相关产品推荐

