提问人:Disco 提问时间:7/14/2016 更新时间:11/19/2023 访问量:2266
为什么我在 SSIS 中处理了 0 行?
Why am I getting 0 rows processed in SSIS?
问:
我正在使用 MS Visual Studio 2012 Shell 和 .Net 框架 4.6.01055 创建一个 SSIS 包。SSIS 包具有一个数据流任务,其中包含平面文件源、数据源行计数、最终数据集计数和 OleDb 目标任务。它连接到 SQL 数据库,我已检查我的连接是否已通过测试。
我有一个平面文件连接管理器,它选取一个文本文件。在“预览”部分,它仅显示平面文件连接管理器编辑器中的标题列。错误消息仅处于警告级别,并显示以下消息:[平面文件源 [10]] 警告:读取标题行时已到达数据文件的末尾。确保标题行分隔符和要跳过的标题行数正确无误。文件本身共有 19 行,第一行是标题行。
我在源文件的标头名称中有空格。因此,在该文件上,我编辑了最后一列没有空格。这并没有解决问题。最后一列是日期,但我指定为 50 的 OutputColumnWidth,将数据类型指定为 string[DT_STR]。我将行分隔符设置为{CR}{LF}。我将列分隔符设置为 {|}。运行时,包文件名不会更改。
在编辑器的“常规”部分中,locale = English;不检查 Unicode;代码页 = 1252 (ANSI-Latin1);格式 = 分隔;文本限定符 = none;标题行 delimeter = {CR}{LF}(我也尝试过 CR 或 LF);标题行要跳过=0(我也尝试过1,因为只有一个标题行);如果第一个数据行,我已经检查了列名。
为什么我在预览部分中没有获取数据?为什么它认为我只有一个标题?
答:
在我看来,您的文本文件没有匹配的 EOL 标记,因此 SSIS 从不拆分行(并将文件视为只有一个大标题)。
尝试在文本编辑器中打开文件,以便查看 EOL 标记。我知道NotePad ++可以为您做到这一点。
NotePad++ 还允许您更改文件的编码,以防这也是一个问题。
注意:问题也可能是您没有指定正确的列分隔符。如果在 SSIS 中指定的分隔符与文件中的字符不匹配,则 SSIS 还会认为你有一个标题行,其中所有内容都在第一列中。
评论
只是为了补充另一个答案: 我遇到了同样的问题,当我在记事本中打开文件时,很明显底部有一个尾随的空行。
因此:确保文件的最后一行实际上包含文本。
我发现问题出在源平面文件的编码上。这些文件来自UNIX / Linux系统。当然,您可以使用Notepad++之类的软件来修改属性,但是如果要自动执行此操作,则需要其他软件。因此,我编写了一个脚本任务,它获取每个源文件,将其转换为 UTF8(我的目标数据库使用 1252 代码页)和代码页进行匹配,并生成一个名称中带有一些前缀的新文件。然后,SSIS 进程将获取结果文件,并且运行良好。
要转换文件,我使用这种 C# 代码:
using (TextFieldParser csvParser = new TextFieldParser(fullSourceFileName))
{
csvParser.HasFieldsEnclosedInQuotes = true;
// Uncomment to skip the row with the column names
// csvParser.ReadLine();
while (!csvParser.EndOfData)
{
// Read current line fields, pointer moves to the next line.
string unicodeLine = csvParser.ReadLine();
var encondedBytes = Encoding.UTF8.GetBytes(unicodeLine);
var strUTF8 = new string(encondedBytes.Select(b => (char)b).ToArray());
builderOutput.AppendLine(strUTF8);
rowCount++;
}
}
TextFieldParser 类在 Microsoft.VisualBasic.FileIO 库中可用,您将添加对它的引用。
评论