You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 IsTargetHeader
      
    • EndRowIndex:获取当前行及之后最近的结束行号,表达式:
      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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 09:13:23