有没有办法在SSIS Csv导入上的文本限定字符串中转义双引号?

时间:2011-07-07 21:17:02

标签: sql-server sql-server-2005 ssis

我有一个CSV我试图通过代码使用SSIS包导入SQL。 一行可能看起来像这样

321,1234,"SOME MACHINE, MACHINE ACCESSORIES 1 1/2"" - 4"""

在这个例子中,他们使用双引号来表示英寸。他们试图用双引号逃脱英寸双引号。然而,SSIS并不尊重这种逃避现实而失败。

无论如何我仍然可以使用英文的双引号符号并在引用的文本中将其转义?

许多建议是用两个单引号替换双引号。这是唯一的解决方法还是我可以使用其他一些逃脱技术?

我见过人们谈论使用派生列转换,但在我的情况下,SSIS在平面文件源步骤失败,因此我无法进入派生列转换步骤。

我目前正在控制流中运行一个脚本任务,就在数据流之前,用一些正则表达式操纵Csv来清理数据。

由于描述列中可能有逗号,我需要使用2个外部双引号对字符串进行文本限定。

对于文本限定字符串中的双引号,我该怎么办?

5 个答案:

答案 0 :(得分:5)

哇,我希望能够回答“只是设置文本限定符”,但是我想你已经尝试过了,所以我在回答之前就试过了。令人惊讶的是,SSIS不支持标准的CSV文件!

看起来这是common complaint。微软有一条关于一些可能有帮助的样本的评论; Here is the codeplex project,他们提到正则表达式平面文件源示例和定界文件读取器源示例特别有用 - 我猜测分隔文件阅读器会更有价值。

答案 1 :(得分:3)

昨天我遇到了类似的问题。

我们得到了使用逗号,作为分隔符并双引号"作为文本限定符的csv文件,但是有一个字段在双引号内包含双引号(非转义双引号内)字符串)。

在花了半天时间搜索后,想出了以下解决方案:

// load the file into a one dimensional string array.
// fullFilePath is the full path + file name.
var fileContent = File.ReadAllLines(fullFilePath);

// Find double quotes within double quotes and replace with a single quote
var fileContentUpdated = fileContent.Select(
    x => new Regex(@"(?<!^)(?<!\,)""(?!\,)(?!$)"
    ).Replace(x, "'")).ToArray();

// write the string array into the csv file.
File.WriteAllLines(fullFilePath, fileContentUpdated);

除了用其他东西替换双引号以外,我没有看到任何其他方法来避免这个问题。

答案 2 :(得分:2)

此答案不适用于此处引用的2005,但如果有人在搜索时遇到此问题并且正在使用2008,则此另一个问题似乎有一个有效的答案:SSIS 2008 and Undouble

答案 3 :(得分:0)

如果在“文件”连接中删除了“作为文本限定符”,然后可以使用派生的列表达式REPLACE(Item_Name,“ \”“,”“)删除所有双引号,则有一种解决方法。缺点是您需要在每个领域都做到这一点

答案 4 :(得分:-2)

现在可能是旧的新闻,但是这个问题在SQL Server 2012中得到修复。我能够在我的2008服务器上失败的2012服务器上导入相同的文件。