如何在ADF中基于可变表头提取指定范围的行数据?
在Azure Data Factory中提取非标准CSV的指定数据块
针对你这种包含多段非结构化内容的CSV文件,可通过ADF数据流的文本行处理+窗口函数实现精准提取,具体步骤如下:
1. 按纯文本行读取文件
创建分隔符文本数据集,将分隔符设置为文件中不存在的字符(比如|),确保每行内容被完整读取为单个字符串列(命名为RawLine),避免非标准格式导致的列拆分错误。
2. 为每行添加唯一行号
添加派生列转换,新增列RowNumber,使用表达式:
rowNumber()
给每行分配递增的唯一序号,用于后续定位数据区间。
3. 标记目标表头与结束行
再添加一个派生列转换,新增两个标记列:
IsTargetHeader:匹配目标表头行,表达式:equals(RawLine, 'Account Number,col2,col3,col4,col5,col6')IsTargetEndLine:匹配目标结束行,表达式:equals(RawLine, '333331,a,bc,def,ghi,2022-01-12')
匹配成功时返回true,否则返回false。
4. 用窗口函数确定有效数据区间
添加窗口转换:
- 分区键留空(全局处理所有行)
- 排序依据选择
RowNumber(升序) - 新增两个计算列:
StartRowIndex:获取当前行及之前最近的表头行号,表达式:max(RowNumber) over (order by RowNumber rows between unbounded preceding and current row) where IsTargetHeaderEndRowIndex:获取当前行及之后最近的结束行号,表达式:min(RowNumber) over (order by RowNumber rows between current row and unbounded following) where IsTargetEndLine
目标区间内的行会有有效值,区间外的行这两个字段为null。
5. 筛选目标数据行
添加筛选转换,设置条件:
and(not(isNull(StartRowIndex)), not(isNull(EndRowIndex)), RowNumber >= StartRowIndex, RowNumber <= EndRowIndex, StartRowIndex < EndRowIndex)
该条件会保留表头到结束行之间的所有行,同时排除结束行在表头之前的无效场景。
6. 转换为结构化数据
- 添加拆分列转换,将
RawLine按逗号分隔为6个列,分别命名为AccountNumber、col2、col3、col4、col5、col6。 - 再添加筛选转换,去掉表头行:
not(equals(AccountNumber, 'Account Number'))
7. 处理表头不存在的场景
在最终筛选后添加条件拆分转换:
- 分支1:
count(AccountNumber) > 0,输出到目标数据集 - 分支2:默认分支,可选择输出到空数据集或触发异常通知,处理表头不存在的情况
内容的提问来源于stack exchange,提问作者Carlos
相关产品推荐
相关产品推荐

