SSIS Flat文件无法处理nul(/ x00)值?

时间:2013-06-27 07:36:40

标签: ssis

我正在尝试将数据从文本文件加载到数据库。我的源文件以某种方式包含null charactor(nul)(Picture1)。  Picture1
我只是将所有字段设为一列(用{CR} - {LF}分隔)。然后我会预览数据。Picutre2。数据正是我们所需要的。 但是当我运行包时,数据发生了变化,而不像我在数据预览中看到的那样。 我添加了一个数据查看器来查看数据。 Picture3 Picture4

第一行中的数字1消失(参见红色)。似乎平面文件读取在NUL字符结束。但我的行分隔符是{CR} - {LF},它最终消失的数字1没有意义。谁能告诉我为什么会这样?

2 个答案:

答案 0 :(得分:5)

再现错误

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

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

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

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

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

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

enter image description here

所有NUL个字符均被删除:

enter image description here

在多个文件中查找并替换

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

在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

参考

答案 1 :(得分:0)

映射其列中的每个字段(我使用Tab {t}作为列分隔符,并将{CR} {LF}作为行分隔符)并再试一次。