基于条件加载目标数据:如何通过转换实现Ref_no过滤逻辑?
实现指定数据过滤逻辑的几种实用思路
核心需求很明确:只要某个Ref_no下存在状态为'A'的记录,就把这个Ref_no的所有记录全部排除,只保留完全没有'A'状态的Ref_no的记录。下面分享几种不同场景下的实现方案:
1. SQL 方案(数据已导入数据库)
如果能把平面文件的数据先导入数据库临时表,用SQL是最直接的方式:
方式一:CTE关联过滤
WITH bad_refs AS ( -- 先找出所有包含'A'状态的Ref_no SELECT DISTINCT Ref_no FROM temp_input_table WHERE status = 'A' ) -- 筛选出不在黑名单里的记录 SELECT t.Ref_no, t.status FROM temp_input_table t LEFT JOIN bad_refs b ON t.Ref_no = b.Ref_no WHERE b.Ref_no IS NULL;
方式二:子查询简化版
SELECT Ref_no, status FROM temp_input_table WHERE Ref_no NOT IN ( SELECT DISTINCT Ref_no FROM temp_input_table WHERE status = 'A' );
2. Python 脚本方案(直接处理平面文件)
适合需要直接操作本地CSV文件的场景,分两种实现方式:
用Pandas快速处理(适合大文件)
import pandas as pd # 读取源文件 df = pd.read_csv("input.csv") # 生成需要排除的Ref_no列表 bad_refs = df[df["status"] == "A"]["Ref_no"].unique() # 筛选有效数据 result_df = df[~df["Ref_no"].isin(bad_refs)] # 写入目标文件 result_df.to_csv("output.csv", index=False)
纯Python实现(无需第三方库,适合小文件)
# 读取所有内容 with open("input.csv", "r", encoding="utf-8") as f: all_lines = f.readlines() # 分离表头和数据行 header = all_lines[0] data_lines = all_lines[1:] # 收集需要排除的Ref_no bad_refs = set() for line in data_lines: ref_no, status = line.strip().split(",") if status == "A": bad_refs.add(ref_no) # 筛选并写入结果 with open("output.csv", "w", encoding="utf-8") as f: f.write(header) for line in data_lines: ref_no, _ = line.strip().split(",") if ref_no not in bad_refs: f.write(line)
3. ETL工具方案(以Informatica为例)
如果用专业ETL工具处理,流程如下:
- 步骤1:读取源数据:通过平面文件源组件加载输入CSV。
- 步骤2:标记坏Ref_no:
- 添加聚合器(Aggregator)转换,按
Ref_no分组,用表达式MAX(DECODE(status, 'A', 'Y', 'N')) AS has_A判断该Ref_no是否存在'A'状态。 - 用过滤器(Filter)转换筛选出
has_A = 'Y'的记录,得到坏Ref_no列表。
- 添加聚合器(Aggregator)转换,按
- 步骤3:关联过滤:
- 将原始源数据和坏Ref_no列表做左关联,关联键为
Ref_no。 - 过滤出关联结果中坏Ref_no为NULL的记录(即该Ref_no没有'A'状态)。
- 将原始源数据和坏Ref_no列表做左关联,关联键为
- 步骤4:写入目标:将过滤后的记录通过平面文件目标组件写入输出CSV。
4. Shell脚本方案(Linux/Unix环境)
适合服务器端批量处理的场景:
# 第一步:提取所有包含'A'的Ref_no,去重后存入临时文件 grep ',A' input.csv | cut -d',' -f1 | sort -u > bad_refs.tmp # 第二步:保留表头,再筛选不在黑名单里的记录 head -n 1 input.csv > output.csv grep -vFf bad_refs.tmp input.csv | grep -v ',A' >> output.csv # 清理临时文件 rm bad_refs.tmp
内容的提问来源于stack exchange,提问作者sha12
相关产品推荐
相关产品推荐

