SQL 由于某些字段中的意外换行,COPY INTO 无法解析 CSV。 ROWTERMINATOR 和 FIELDQUOTE 参数不起作用

SQL COPY INTO is unable to parse a CSV due to unexpected line feeds in some fields. ROWTERMINATOR and FIELDQUOTE paramters do not work

我在 Azure 数据湖中有一个 CSV 文件,用记事本++打开时看起来像这样:

   a,b,c
   d,e,f
   g,h,i
   j,"foo

   bar,baz",l

在 notepad++(查看所有符号)中检查后,它向我显示:

   a,b,c[CR][LF]
   d,e,f[CR][LF]
   g,h,i[CR][LF]
   j,"foo[LF]
   [LF]
   bar,baz",l[CR][LF]

也就是说每行之后的正常 Windows 回车 Return 和换行内容。 除了有人为其中一个专栏插入了这样一个奇特的故事之外:

foo

bar, baz

我注入 CSV 的 TSQL 代码如下所示:

COPY INTO 
    dbo.SalesLine 
FROM 
    'https://mydatalakeblablabla/folders/myfile.csv' 
WITH ( 
    ROWTERMINATOR = '0x0d',    -- Tried \n \r\n , 0x0d0a here
    FILE_TYPE = 'CSV',   
    FIELDQUOTE  = '"',         
    FIELDTERMINATOR  = ',',       
    CREDENTIAL = (IDENTITY = 'Managed Identity')   --Used to access datalake
)

但是查询不起作用。 SSMS 中的常见错误消息是:

数据文件中第 4 行第 2 列 (NAME) 的批量加载数据转换错误(指定代码页的类型不匹配或无效字符)

我无法以任何方式更正数据湖中的错误行或修改 CSV。 显然它是真实数据的大文件,但我举了一个简单的例子。

如何修改或重新编写 TSQL 代码以在读取 CSV 时更正它?

我重新创建了一个类似的文件并将其上传到我的数据湖和无服务器 SQL 池似乎管理得很好:

SELECT *
FROM
    OPENROWSET(
        BULK 'https://somestorage.dfs.core.windows.net/datalake/raw/badFile.csv',
        FORMAT = 'CSV',
        PARSER_VERSION = '2.0'
    ) AS [result]

我的结果:

这似乎是一种解决方法,但如果无服务器中改进的解析器可以轻松解决此类问题,那么为什么不使用整个套件 Azure Synapse Analytics。您可以在 Synapse Pipeline 中的 Copy activity 中使用无服务器查询作为源,并将其加载到专用的 SQL 池中,这与使用 COPY INTO 命令的结果相同。

过去我做过一些事情,比如编写特殊的解析例程,将文件加载为一列并将其拆分到数据库中或使用正则表达式,但如果有一个简单的解决方案,为什么不使用它。

我通过 online hex editor 查看了我的测试文件,也许我遗漏了一些东西: