SSIS平面文件,其值包含文本限定符

时间:2019-05-24 20:22:48

标签: csv ssis etl flat-file delimited

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

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

由于值中的双引号,我收到此错误:

  

[平面文件源[58]]错误:找不到“ XYZ”列的列定界符。

     

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

如何处理此文件?

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

1 个答案:

答案 0 :(得分:1)

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

在线上有很多链接,以了解有关平面文件源错误输出的更多信息:


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

由于“平面文件”错误输出不起作用,您可以使用带有条件拆分的脚本组件来过滤不良行,以下更新是逐步实现此问题的分步指南:

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

enter image description here

  1. 添加脚本组件,转到“输入和输出列”选项卡,添加所需的输出列(在本示例中为4列),并添加类型为DT_BOOL的标志列
  2. 在脚本组件内部编写以下脚本,以检查列数是否为4,然后Flag = True,这意味着这是有效行,否则将Flag设置为{{1 }}表示这是糟糕的行:
False
  1. 添加条件拆分以根据[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; } } } 列拆分行

enter image description here

  1. 将“有效行”输出映射到OLEDB目标,将“坏行”输出映射到另一个仅映射Flag的平面文件

enter image description here