首页 > 解决方案 > Azure 数据工厂转义字符和引用问题 - 复制活动

问题描述

我有 ADF 管道将数据从 Azure SQL db 导出(通过复制活动)到 Data Lake (ADLS2),然后从那里导出到另一个 Azure SQL db。在出现一些字符之前,它工作正常。

这是罪魁祸首记录在第一个 Azure SQL 数据库中的样子:“Gasunie\

在此处输入图像描述

这是在 ADF 中设置数据集以将其导出到 ADLS 的方式:列分隔符 - 管道行分隔符 - 自动检测编码 - 默认(UTF-8)转义字符 - 反斜杠()引号字符 - 双引号(“)

在此处输入图像描述

这是导出文件在 notepad++ 中的样子(它是管道分隔的文件): "\"Gasunie\" 在此处输入图像描述

这些是 ADF 中的 adls 数据集从 adls 加载到 azure sql db 时的设置:列分隔符 - 逗号行分隔符 - 自动检测编码 - 默认(UTF-8)转义字符 - 反斜杠()引号字符 - 双引号(“)

请注意,它现在以逗号分隔,但这不会导致任何问题。

在此处输入图像描述

但这就是它加载后的样子:“Gasunie”|1|||||||||||... 最初存在的反斜杠不知何故导致它停止了接下来几列的定界。 在此处输入图像描述

我已经为引号和转义字符尝试了很多很多不同的设置,但是它们给数据集中的其他数据带来了更多问题。

有谁知道我如何纠正它而不必要求纠正来源?

注意:它存储在 adls 中是有原因的,因此它不能从 Azure sql db 复制到另一个 Azure Sql db。

它是由顾问根据模板构建的,高度参数化,因此插入数据流以处理 adls 中的文件将是一个非常漫长的过程。

任何帮助表示赞赏。谢谢你。

标签: csvescapingazure-data-factoryquotescopy-activity

解决方案


我遇到了类似的问题。

我认为发生在你身上的是这样的。

  • 数据为 9 个字符,如“Gasunie\
  • 输出写为“引用”并使用 \ 作为转义字符。
  • 所以输出将是“your_text”,但 your_text 中的任何引号都替换为 \"
  • 所以输出是 "\"Gasunie\" - 外部引号包含您的文本,内部引号已用 \ 转义

现在我们重新读一遍:它似乎是这样解析的。

  • 第一个引号是您引用的字段值的开头,所以从这里开始我正在阅读您的文本字段值。
  • 然后我看到 \" 这是一个引号字符(已被转义)。
  • 然后我看到加苏尼
  • 然后我看到 \" 这是一个引号字符(已被转义)。
  • 然后我看到字段分隔符,但由于我仍然认为我在引用的字段内,所以它们只是文本,所以包含在我的输出“Gasunie”|1|||||||||||...
  • 我一直在这个字段中读取字符,直到我到达下一个双引号,此时我期待一个新的分隔符开始下一个字段。

所以问题是 ADF 将引号括住它手头的任何字符串并将其写入输出;在输入时,它从左到右解析,因此任何以转义字符结尾的字符串都是一个问题。我不确定您是否会称其为错误。

你能做什么?

在您的情况下,只需将转义字符更改为您输入中从未见过的内容(可能是 @ 或 { 或其他内容)。然后输出文本末尾的 \" 不再是转义引号。

我的类似情况- 转义字符何时不是转义字符?

我有一个包含逗号的字段,但逗号也是字段分隔符。我的数据来自第三方,他们使用反斜杠轻松地为我转义了这个逗号,因此:

Field One, Field\,Two, Field Three

我有 \ 作为我的转义字符,所以你会认为这会给我三个输出字段:

| Field One | Field,Two | Field Three |

错误的。转义字符仅在引用字段内时才有效。我的输入没有被引用,所以反斜杠被视为文本,逗号是字段分隔符,这意味着我的输出有四个字段

| Field One | Field\ | Two | Field Three |

解决方案:告诉我的 ADF 数据集我的输入周围没有引号字符 - 然后它将逗号后面的任何内容视为文本字段并按预期应用转义字符。

在此处输入图像描述

您可能还对此https://feedback.azure.com/forums/270578-data-factory/suggestions/35482144-text-format-escape-char-only-if-needed-or-per-fiel感兴趣。

因此,如果您正在寻找“csv 中的转义逗号正在创建额外的字段”,我希望这可以为您节省一点时间!


推荐阅读