使用ADF Copy命令替换CSV带引号字符串内的多余双引号
ADF Copy命令处理CSV嵌套双引号替换方案
针对你用ADF Copy命令处理超100万条记录的CSV文件(路径SFTP→ADLS→数据库),需要替换字符串字段内的多余双引号为竖线(|)的需求,以下是不依赖Python/Databricks/JSON的原生ADF解决方案:
核心前提设置
先确保CSV数据集的转义配置正确:在SFTP/ADLS的CSV数据集设置中,将转义字符设为"(双引号),这样ADF能正确识别字符串内部的""为转义双引号,而非字段边界。
方法1:Copy Activity派生列(轻量处理)
适合字段结构固定的场景,直接在Copy映射中处理:
- 进入Copy Activity的「映射」界面,导入完整架构。
- 对每个字符串类型字段(原数据中被双引号包裹的字段),添加派生列,使用以下表达式:
这个表达式会跳过空值字段(原数据中iif(columnName == '""', '""', replace(columnName, '""', '|'))""),仅替换字符串内部的""为|。 - 数值字段和空值字段保持原样,无需修改。
方法2:Data Flow批量替换(适合复杂字段结构)
如果字段较多或结构易变,用ADF原生Data Flow处理(不属于Databricks/Python范畴):
- 创建Data Flow,源连接SFTP的CSV文件,确保「引号转义」已开启。
- 添加「替换值」转换:
- 选择所有字符串类型字段作为目标列;
- 设置查找值为
"(Data Flow会自动把CSV中的""解析为单个"); - 替换值设为
|; - 附加条件:仅当字段非空时执行替换,表达式为:
iif(!isEmpty($$), replace($$, '"', '|'), $$)
- 将处理后的数据输出到ADLS或直接写入数据库。
正则替换方案(针对全文件处理)
如果之前正则尝试失败,可使用匹配字符串内部双引号的正则,在源的「附加设置」中配置全文件替换:
- 查找正则:
""(?=(?:[^"]*"[^"]*")*[^"]*$) - 替换为:
|
这个正则会精准匹配字符串内部的""(通过检查后续引号数量为偶数,判断当前双引号处于字段内部),不会影响字段边界的引号或空值字段。
数据示例验证
原数据:
1,"abc","Class (""G"") as agreed , with new Value x",7004,"rec" 2,"prq","Promoting ""Junior"" to Senior, showing good results","",x处理后结果:
1,"abc","Class (|G|) as agreed , with new Value x",7004,rec 2,"prq","Promoting |Junior| to Senior, showing good results","",x
内容的提问来源于stack exchange,提问作者sachin
相关产品推荐
相关产品推荐

