【问题标题】:SSIS flat file with values containing text qualifierSSIS 平面文件,其值包含文本限定符
【发布时间】:2019-10-11 10:31:24
【问题描述】:

我收到了一个无法以其他方式生成的平面文件。分隔符是逗号,文本限定符是双引号。问题是有时 a 在值中有双引号。例如:

"0","12345", "Centre d"edu et de recherche", "B8E7"

由于值中的双引号,我收到了这个错误:

[平面文件源 [58]] 错误:未找到列“XYZ”的列分隔符。

[平面文件源 [58]] 错误:处理数据行 296 上的文件“C:\somefile.csv”时出错。

我可以做些什么来处理这个文件?

我将 SSIS 2016 与 Visual Studio 2015 一起使用

【问题讨论】:

  • 你确定Center d"edu有一个引用,而不是两个相邻的引用吗?如果只有一个,我会问谁在为你生成文件来修复它。如果没有修复,您无法正确识别经过防腐处理的字符串,例如 ","
  • 是的,我确定,但我们无法控制文件的生成方式。我必须想办法解决它。
  • 我不知道你的情况,但我的回答是这个文件不能以可维护的方式导入并升级给创建它的人。

标签: csv ssis etl flat-file delimited


【解决方案1】:

您可以使用平面文件源错误输出将错误行重定向到另一个平面文件并手动更正值,同时将处理所有有效行。

网上有很多链接可以详细了解平面文件源错误输出:


更新 1 - 使用脚本组件和条件拆分的解决方法

由于平面文件错误输出不起作用,您可以使用带有条件拆分的脚本组件来过滤坏行,以下更新是实现该功能的分步指南:

  1. 添加平面文件连接管理器,转到高级选项卡,删除除一列之外的所有列并将其长度更改为 4000

  1. 添加脚本组件,转到输入和输出列选项卡,添加所需的输出列(在本例中为 4 列)并添加类型为 DT_BOOL 的标志列
  2. 在脚本组件中编写以下脚本来检查列数是否为 4 然后Flag = True 这意味着这是一个有效的行否则将Flag 设置为False 这意味着这是一个坏行:
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {

        if (!Row.Column0_IsNull && !String.IsNullOrWhiteSpace(Row.Column0))
        {

            string[] cells = Row.Column0.Split(new string[] { "\",\"" }, StringSplitOptions.None);


            if (cells.Length == 4)
            {

                Row.Col1 = cells[0].TrimStart('\"');
                Row.Col2 = cells[1];
                Row.Col3 = cells[2];
                Row.Col4 = cells[3].TrimEnd('\"');
                Row.Flag = true;
            }
            else
            {
                bool cancel;
                Row.Flag = false;
            }

        }
        else
        {

            Row.Col1_IsNull = true;
            Row.Col2_IsNull = true;
            Row.Col3_IsNull = true;
            Row.Col4_IsNull = true;
            Row.Flag = true;
        }

    }

}
  1. 添加条件拆分以根据Flag 列拆分行

  1. 将有效行输出映射到 OLEDB 目标,将坏行输出映射到另一个平面文件,您只映射 Column0

【讨论】:

  • 我试过了,但它没有重定向。可能是因为它无法猜测哪一列是哪一列。
  • @Bradford1138 我将在一段时间内提供逐步解决方法
  • 这行得通,但我需要所有行。我正在将 SSIS 2008 迁移到 2016 年,并且在 2008 年,该文件有效。所以我需要2016年相同的数据。这家伙解释了和我一样的问题:blogs.msdn.microsoft.com/dataaccesstechnologies/2017/12/29/…
  • @Bradford1138 i need all the row 是什么意思?您是否尝试过解决方案?
  • @Bradford1138 此外,此解决方案也适用于嵌入式限定符,因为该行由位于两个限定符内的分隔符分割
猜你喜欢
  • 2014-10-16
  • 2015-09-05
  • 2016-11-09
  • 2016-03-28
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
相关资源
最近更新 更多