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

mor*_*117 6 sql-server null ssis etl flat-file

我正在尝试将数据从文本文件加载到数据库。我的源文件NUL以某种方式包含空字符(图片1)。

图片1

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

Picutre2

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

图片3

图片4

数字1在第一行消失(请参见红色)。似乎平面文件的读取以NUL字符结尾。但是我的行定界符是{CR}{LF},最后消失的数字1没有意义。谁能告诉我为什么?

Had*_*adi 5

重现错误

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

我创建了一个名为的文本文件TestNUL,其中包含与问题中张贴的屏幕快照类似的数据(逗号NUL应放在对象应放置的位置):

在此处输入图片说明

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

在此处输入图片说明

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

在此处输入图片说明

现在,文本文件将如下所示:

在此处输入图片说明

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

使用记事本++删除NUL字符

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

在此处输入图片说明

所有NUL字符均被删除:

在此处输入图片说明

在多个文件中查找和替换

如果要在多个文件中查找和替换此字符,则可以使用“记事本功能通过“在文件中查找”功能来执行此操作:

在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;
}

Run Code Online (Sandbox Code Playgroud)

如果使用大型文本文件,则可以使用System.IO.StreamReaderSystem.IO.StreamWriter类使用ReadLine()函数逐行读取文件。

实验

我创建了一个程序包,并添加了两个平面文件连接管理器,源从TestNUL.txt文件中读取文件,而目标创建TestNUL_edited.txt具有相同结构的新文件。我在上面的代码中添加了一个脚本任务,并在数据流任务中添加了数据查看器,以下屏幕截图显示了行是如何损坏的:

在此处输入图片说明

在此处输入图片说明

以下屏幕快照还显示了NUL运行脚本任务后如何从源文件中删除值:

在此处输入图片说明

参考文献


Umb*_*rto 0

映射其列中的每个字段(我想使用 Tab {t} 作为列分隔符,使用 {CR}{LF} 作为行分隔符),然后重试。


归档时间:

查看次数:

490 次

最近记录:

6 年,4 月 前