mor*_*117 6 sql-server null ssis etl flat-file
我正在尝试将数据从文本文件加载到数据库。我的源文件NUL以某种方式包含空字符(图片1)。
我只是将所有字段都设为一列(以分隔{CR}{LF})。然后我进行数据预览。
数据正是我们所需要的。但是,当我运行该程序包时,数据发生了变化,这与我在数据预览中看到的不一样。我添加了一个数据查看器以查看数据。
数字1在第一行消失(请参见红色)。似乎平面文件的读取以NUL字符结尾。但是我的行定界符是{CR}{LF},最后消失的数字1没有意义。谁能告诉我为什么?
首先,我想展示使用Notepad ++编辑器重现此错误的步骤。
我创建了一个名为的文本文件TestNUL,其中包含与问题中张贴的屏幕快照类似的数据(逗号NUL应放在对象应放置的位置):
现在,转到“编辑”菜单栏>>字符面板
现在显示了ASCII字符面板,双击NULL值以将其添加到文本中:
现在,文本文件将如下所示:
您可以使用以下链接下载文件:
要删除此字符,您只需打开Notepad ++,单击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;
}
Run Code Online (Sandbox Code Playgroud)
如果使用大型文本文件,则可以使用System.IO.StreamReader和System.IO.StreamWriter类使用ReadLine()函数逐行读取文件。
我创建了一个程序包,并添加了两个平面文件连接管理器,源从TestNUL.txt文件中读取文件,而目标创建TestNUL_edited.txt具有相同结构的新文件。我在上面的代码中添加了一个脚本任务,并在数据流任务中添加了数据查看器,以下屏幕截图显示了行是如何损坏的:
以下屏幕快照还显示了NUL运行脚本任务后如何从源文件中删除值:
| 归档时间: |
|
| 查看次数: |
490 次 |
| 最近记录: |