我有 ADF 管道将数据从 Azure SQL DB 导出(通过复制事件)到 Data Lake (ADLS2),然后从那里导出到另一个 Azure SQL DB。在出现一些字符之前它工作正常。
这是罪魁祸首记录在第一个 Azure SQL 数据库中的样子: "加苏涅\
这是在 ADF 中设置数据集以将其导出到 ADLS 的方式: 列分隔符 - 管道 行分隔符 - 自动检测 编码 - 默认 (UTF-8) 转义字符 - 反斜杠() 引号字符 - 双引号 (")
导出的文件在 notepad++ 中是这样的(它是一个竖线分隔的文件): “”加苏尼“
这些是将 ADF 中的 adls 数据集从 adls 加载到 azure SQL DB 时的设置: 列分隔符 - 逗号 行分隔符 - 自动检测 编码 - 默认 (UTF-8) 转义字符 - 反斜杠() 引号字符 - 双引号 (")
请注意,它现在是逗号分隔的,但这不会导致任何问题。
但这是加载后的样子: “加苏涅”|1|||||||||||... 最初存在的反斜杠以某种方式导致它停止对接下来的几列进行定界。
我为引号和转义字符尝试了很多很多不同的设置,但它们会给数据集中的其他数据带来更多问题。
有谁知道如何在不要求更正源的情况下更正它?
注意:它存储在 adls 中是有原因的,因此它不能从 Azure sql DB 复制到另一个 Azure Sql DB。
它是由顾问根据模板构建的,并且高度参数化,因此插入数据流以处理 adls 中的文件将是一个非常漫长的过程。
感谢任何帮助。谢谢。
最佳答案
我遇到了类似的问题。
我认为发生在你身上的是这个。
- 数据是9个字符,比如"Gasunie\
- 输出被写成“引号”并使用\作为转义字符。
- 因此输出将是“your_text”,但 your_text 中的任何引号都将替换为\"
- 所以输出是 "\"Gasunie\"- 外面的引号将你的文本和 里面的一个已经用\ 转义了
现在我们回来读这个:它似乎是这样解析的。
- 第一个引号是您引用的字段值的开头,因此从这里开始我将读取您的文本字段值。
- 然后我看到\"这是一个引号字符(已被转义)。
- 然后我看到了 Gasunie
- 然后我看到\"这是一个引号字符(已被转义)。
- 然后我看到字段分隔符,但因为我仍然认为我在引用字段中,所以它们只是文本,因此包含在我的输出中 "Gasunie"|1||||||||||| ...
- 我一直在这个字段中读取字符,直到到达下一个双引号,此时我期待一个新的定界符开始下一个字段。
所以问题是 ADF 将引号放在手头的任何字符串周围并将其写入输出;在输入时,它从左到右进行解析,因此任何以转义字符结尾的字符串都是一个问题。我不确定您是否会称其为错误。
你能做什么?
在您的情况下,只需将转义字符更改为您输入中从未见过的字符(可能是 @ 或 { 或其他字符)。然后输出文本末尾的\"不再是转义引号。
我的类似案例 - 什么时候转义字符不是转义字符?
我有一个包含逗号的字段,但逗号也是字段分隔符。我的数据来自第三方,他们使用反斜杠轻松地为我转义了这个逗号,因此:
字段一,字段\,二,字段三
我有\作为我的转义符,所以你会认为这会给我三个输出字段:
|现场一 |场,二 |字段三 |
错了。转义字符仅在引用字段内时才有效。我的输入未被引用,因此反斜杠仅被视为文本,逗号是字段分隔符,这意味着我的输出有四个字段
|现场一 |字段\|两个 |字段三 |
解决方案:告诉我的 ADF 数据集我的输入周围没有引号字符 - 然后它将逗号后的任何内容视为文本字段并按预期应用转义字符。
因此,如果您正在寻找“csv 中的转义逗号正在创建额外的字段”,我希望这能为您节省一些时间!
关于csv - Azure 数据工厂转义字符和引用问题 - 复制事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61593352/