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