如果前面没有“(双引号),则将分号替换为空
Replace semi-colon with nothing if NOT preceded by " (double quote)
我有一个像 "Column";"Column";"Column"
.
这样的字符串
然而,有几次我看到:
"Column";"Column;";"Column"
(注意第二个字段中的额外分号)。
是否可以找到分号 (;
) 未被双引号 ("
) 包围的所有实例并将其替换为空?
类似于 replace(@string,'[a-z][0-9];','')
?
"Column";"Column;";"Column
" 变成 "Column";"Column";"Column"
"Value";"Value;";"Value"
变成"Value";"Value";"Value"
"Something";";Something else;";"Another ;thing"
变成 "Something";"Something else";"Another thing"
不知道您 table 的定义,这是一个模糊的答案。
在 SQL Server 2017(如果我没记错的话)中,BULK INSERT
添加了对 CSV 格式的支持,这意味着您可以同时指定列和行分隔符 和 引用标识符。对于上述内容,这意味着您的 FIELDTERMINATOR
需要值 ';'
,而 FIELDQUOTE
需要值 '"'
。但是,这将保留用双引号引起来的其余 ;
个字符。
因此,我建议创建一个分段 table,其中所有列都是 (n)varchar
,BULK INSERT
您的数据,然后 INSERT
将数据放入您的生产 table,使用 REPLACE
运算符删除剩余的 ;
个字符并强类型化它们。
在伪 SQL 中看起来像这样:
BULK INSERT Staging.YourTable
FROM 'C:\YourFilePath\YourFile.txt'
WITH (FORMAT='CSV',
FIELDQUOTE='"',
FIELDTERMINATOR=';');
INSERT INTO Production.YourTable (Column1, Column2, Column3, Column4)
SELECT REPLACE(Column1,';',''),
TRY_CONVERT(int,REPLACE(Column2,';','')),
TRY_CONVERT(date,REPLACE(Column3,';',''),103),
REPLACE(Column4,';','')
FROM Staging.YourTable;
不确定这是否过于简单化,但如果您确实在 @string 中有该字符串,那么我认为没有理由这不起作用:
replace(@string, ';";"', '";"')
我有一个像 "Column";"Column";"Column"
.
然而,有几次我看到:
"Column";"Column;";"Column"
(注意第二个字段中的额外分号)。
是否可以找到分号 (;
) 未被双引号 ("
) 包围的所有实例并将其替换为空?
类似于 replace(@string,'[a-z][0-9];','')
?
"Column";"Column;";"Column
" 变成 "Column";"Column";"Column"
"Value";"Value;";"Value"
变成"Value";"Value";"Value"
"Something";";Something else;";"Another ;thing"
变成 "Something";"Something else";"Another thing"
不知道您 table 的定义,这是一个模糊的答案。
在 SQL Server 2017(如果我没记错的话)中,BULK INSERT
添加了对 CSV 格式的支持,这意味着您可以同时指定列和行分隔符 和 引用标识符。对于上述内容,这意味着您的 FIELDTERMINATOR
需要值 ';'
,而 FIELDQUOTE
需要值 '"'
。但是,这将保留用双引号引起来的其余 ;
个字符。
因此,我建议创建一个分段 table,其中所有列都是 (n)varchar
,BULK INSERT
您的数据,然后 INSERT
将数据放入您的生产 table,使用 REPLACE
运算符删除剩余的 ;
个字符并强类型化它们。
在伪 SQL 中看起来像这样:
BULK INSERT Staging.YourTable
FROM 'C:\YourFilePath\YourFile.txt'
WITH (FORMAT='CSV',
FIELDQUOTE='"',
FIELDTERMINATOR=';');
INSERT INTO Production.YourTable (Column1, Column2, Column3, Column4)
SELECT REPLACE(Column1,';',''),
TRY_CONVERT(int,REPLACE(Column2,';','')),
TRY_CONVERT(date,REPLACE(Column3,';',''),103),
REPLACE(Column4,';','')
FROM Staging.YourTable;
不确定这是否过于简单化,但如果您确实在 @string 中有该字符串,那么我认为没有理由这不起作用:
replace(@string, ';";"', '";"')