SSIS的平面文件无法处理NUL(\x00)值?

6

我正在尝试将文本文件中的数据加载到数据库中。我的源文件中包含空字符NUL(如图1所示)。

Picture1

我只是将所有字段作为一列(用{CR}{LF}分隔)。 然后进行数据预览。

Picutre2

这些数据正是我们需要的。 但是当我运行程序包时,数据发生了变化,不像我在数据预览中看到的那样。我添加了一个数据查看器来查看数据。

Picture3

Picture4

第一行中的数字1消失了(见红色)。似乎平面文件读取在NUL字符处结束。但是我的行分隔符是{CR}{LF},所以最后数字1消失没有道理。有人能告诉我为什么吗?

1
你尝试过以固定宽度导入吗?从你的屏幕截图中看不到任何制表符,实际上它看起来像是一个固定宽度文件。 - Nick.McDermaid
1
一个样本文件(不是图像)将在这里非常有帮助,因为我们可以针对它进行测试,尝试复制问题并查看如何解决它。那些图像看起来也像BIDS;您是否正在使用SQL Server 2008(R2)?肯定您的屏幕截图看起来像Windows XP;而这已经不再得到支持多年了。 - Thom A
哦,等等...这个问题是在2013年提出的。也许@Yahfoufi最好还是提一个新问题。 - Thom A
1
@Yahfoufi,你在说什么?这个问题不是重复的候选项,因为没有得到赞同的答案。如果你说有一个重复的问题存在,那么你已经得到了答案。然而,如果你已经查看了其他类似的问题,但是没有回答你的问题,那么请在问题中引用这些问题,并解释为什么这些解决方案不起作用;这样我们就知道你已经尝试过什么并且失败了(或者不起作用)。 - Thom A
@Larnu 幸运的我:) 下面的回答提到了我需要的一切!! 现在,没有必要再问一个新问题了。 - Yahfoufi
显示剩余5条评论
2个回答

4

重现错误

首先,我想展示使用Notepad++编辑器重现此错误的步骤。

我创建了一个名为TestNUL的文本文件,其中包含类似于问题中发布的屏幕截图的数据(逗号放置在应该有NUL对象的地方):

enter image description here

现在,转到编辑菜单栏 >> 字符面板

enter image description here

现在显示了ASCII字符面板,请双击NULL值以添加到文本:

enter image description here

现在文本文件看起来像:

enter image description here

您可以使用以下链接下载文件:

使用Notepad++删除NUL字符

要删除此字符,您可以简单地打开Notepad ++,单击Ctrl + H打开查找和替换对话框。然后选择使用正则表达式,并将\x00替换为空字符串:

enter image description here

所有NUL字符都被删除了:

enter image description here

在多个文件中查找和替换

如果您想要在多个文件中查找和替换此字符,那么您可以使用Notepad ++使用在文件中查找功能来实现:

在SSIS中自动化该过程

由于问题发生在运行时而不是预览数据时,您可以在数据流任务之前添加一个脚本任务,以将所有\x00值替换为空字符串。您可以从扁平文件连接管理器读取文本文件路径,也可以将其存储在变量中。您可以使用类似的C#代码:


public void Main()
{
    string FilePath = Dts.Connections["SourceConnection"].ConnectionString;

    string text = System.IO.File.ReadAllText(FilePath);
    text = text.Replace(Convert.ToChar(0x0).ToString(), "");
    System.IO.File.WriteAllText(FilePath, text);

    Dts.TaskResult = (int)ScriptResults.Success;
}


如果您正在处理大型文本文件,则可以使用System.IO.StreamReaderSystem.IO.StreamWriter类,使用ReadLine()函数逐行读取文件。
参考: 实验: 我创建了一个包并添加了两个扁平文件连接管理器,源从TestNUL.txt文件读取,目标则创建一个具有相同结构的新TestNUL_edited.txt文件。我添加了一个包含上述代码的脚本任务,并在数据流任务中添加了数据查看器,以下截图显示行未损坏:

enter image description here

enter image description here

此外,以下截图显示运行脚本任务后源文件中的NUL值已被删除:

enter image description here

参考:

0

将他的每个字段映射到列中(使用制表符{t}作为列分隔符,使用{CR}{LF}作为行分隔符),然后再试一次。


不需要列分隔符,因为我不需要将行拆分为几列。我只需要它作为一列。 - morgan117
在您的平面文件源中,请尝试勾选或取消勾选“保留源中的空值作为数据流中的空值”选项。 - Umberto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接