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 查看了我的测试文件,也许我遗漏了一些东西:
我在 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 查看了我的测试文件,也许我遗漏了一些东西: