6

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

图片1

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

图片2

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

图3

图4

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

4

2 回答 2

4

重现错误

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

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

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

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

使用 Notepad++ 删除 NUL 字符

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

在此处输入图像描述

所有NUL字符都被删除:

在此处输入图像描述

在多个文件中查找和替换

如果您要在多个文件中查找和替换此字符,则可以使用 notepad++ 使用Find in Files功能执行此操作:

在 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.StreamReader和类来使用函数System.IO.StreamWriter逐行读取文件。ReadLine()

实验

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

在此处输入图像描述

在此处输入图像描述

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

在此处输入图像描述

参考

于 2019-08-22T20:57:09.137 回答
0

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

于 2013-06-27T07:44:21.327 回答