我正在尝试将数据从文本文件加载到数据库。NUL
我的源文件以某种方式包含空字符(图片1)。
我只是将所有字段设为一列(用 分隔{CR}{LF}
)。然后我做数据的预览。
数据正是我们所需要的。但是当我运行包时,数据发生了变化,不像我在数据预览中看到的那样。我添加了一个数据查看器来查看数据。
数字 1 在第一行消失(见红色)。似乎平面文件读取以NUL
字符结束。但是我的 Row 分隔符是{CR}{LF}
,最后数字 1 消失是没有意义的。谁能告诉我这是为什么?
我正在尝试将数据从文本文件加载到数据库。NUL
我的源文件以某种方式包含空字符(图片1)。
我只是将所有字段设为一列(用 分隔{CR}{LF}
)。然后我做数据的预览。
数据正是我们所需要的。但是当我运行包时,数据发生了变化,不像我在数据预览中看到的那样。我添加了一个数据查看器来查看数据。
数字 1 在第一行消失(见红色)。似乎平面文件读取以NUL
字符结束。但是我的 Row 分隔符是{CR}{LF}
,最后数字 1 消失是没有意义的。谁能告诉我这是为什么?
首先,我想展示使用Notepad++ 编辑器重现此错误的步骤。
我创建了一个名为的文本文件TestNUL
,其中包含类似于问题中发布的屏幕截图的数据(逗号放置在NUL
对象应该位于的位置):
现在,转到编辑菜单条>>字符面板
现在显示 ASCII 字符面板,双击该NULL
值以将其添加到文本中:
现在文本文件将如下所示:
您可以使用以下链接下载文件:
要删除此字符,您只需打开 Notepad++,单击Ctrl+H打开查找和替换对话框。然后选择使用正则表达式并替换\x00
为空字符串:
所有NUL
字符都被删除:
如果您要在多个文件中查找和替换此字符,则可以使用 notepad++ 使用Find in Files功能执行此操作:
由于问题发生在运行时而不是在预览数据时,您只需在数据流任务之前添加一个脚本任务,即可将所有\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
在运行脚本任务后如何从源文件中删除值:
映射他列中的每个字段(我想使用 Tab {t} 作为列分隔符,使用 {CR}{LF} 作为行分隔符)并重试。