SSIS不读取行和列分隔符

时间:2013-04-16 06:44:02

标签: sql-server-2008 ssis

我有一个带有列分隔符的文本文件为| (管道)和行分隔符为CRLF(新行字符)。输出是一个SQL表。 如果我的文件中的数据有更多管道(|)或更多CRLF字符,那么我的连接管理器如下所示: -

  1. 文件中的数据。格式正确。然后表中的输出是正确的。

    [Global Unique Identifier]|[KPI Name]|[KPI Description]|[Process Impacted]|
    [Objective]|[Strategy ID]|[KPI Category]|[KPI Measure Type]
    A26|name|Desc|TPI|YYY|12|CAT|MT
    A27|name|Desc|TPI|YYY|12|CAT|MT
    A28|name|Desc|TPI|YYY|12|CAT|MT
    
  2. 第二行中包含更多列分隔符的文件中的数据,如下所示

    A26|name|Desc|TPI|YYY|12|CAT|MT
    A27|name|Desc|TPI|YYY|12|CAT|MT|||||||||
    A28|name|Desc|TPI|YYY|12|CAT|MT
    

    文件中的输出也如上所述。即第二行的最后一列所有管道也被视为数据。

  3. 文件中的数据如下。即第一行只有一列,我们不会给出其他列分隔符并给出行分隔符。

     A26
     A27|name|Desc|TPI|YYY|12|CAT|MT
     A28|name|Desc|TPI|YYY|12|CAT|MT
    
  4. 然后文件中的输出如下。我们将第一列合并到第二行的第一列。

    A26 A27|name|Desc|TPI|YYY|12|CAT|MT
    A28|name|Desc|TPI|YYY|12|CAT|MT
    

    SSIS期望正确的分隔符,只有它才能提供正确的输出。否则输出表中的数据不正确。 这可以以任何方式处理吗?

    如果对此问题有任何帮助,我将感激不尽。

1 个答案:

答案 0 :(得分:1)

这对你来说是一个很好的起点。

  1. 我使用以下文件作为来源。将其保存到C:\ Temp \ 1.TXT
  2.   

    [全球唯一标识符] | [KPI名称] | [KPI描述] | [流程   受影响] | [目的] |策略ID] | [KPI类别] | [KPI度量类型]

    A26|name1|Desc|TPI|YYY|12|CAT|MT
    A27|name2|Desc|TPI|YYY|12|CAT|MT
    A28|name3|Desc|TPI|YYY|12|CAT|MT
    B26|name4|Desc|TPI|YYY|12|CAT|MT
    B27|name5|Desc|TPI|YYY|12|CAT|MT|||||||||
    B28|name6|Desc|TPI|YYY|12|CAT|MT
    C26
    C27|name7|Desc|TPI|YYY|12|CAT|MT
    C28|name8|Desc|TPI|YYY|12|CAT|MT
    
    1. 在控制流表面上放置DFT。
    2. 将脚本组件作为源放在DFT上

      3.1。转到输入和输出部分

      3.2。添加输出。将其命名为GoodRow。

       3.2.1 Add the following output columns - GUID, KPIN, KPID, PI, Obj, SID, KPIC, KPIMT
      

      3.3添加另一个输出。将其命名为BadRow。      3.3.1只添加一个输出列:AllFields

    3. 现在转到脚本//编辑脚本。输入以下代码。确保添加

    4.   

      使用System.IO;

      到命名空间区域。

      public override void CreateNewOutputRows()
      {
      
          string[] lines = File.ReadAllLines(@"C:\temp\1.txt");
      
          int iRowCount = 0;
          int iFieldCountHeader = 0;
          string[] fields = null;
      
      
          foreach (string line in lines)
          {
              if (iRowCount == 0)
              {
                  iFieldCountHeader = line.Split('|').Length;
                  iRowCount++;
              }
              else
              {
                  fields = line.Split('|');
      
                  if (fields.Length == iFieldCountHeader) // good row
                  {
                      GoodRowBuffer.AddRow();
      
                      GoodRowBuffer.GUID = fields[0];
                      GoodRowBuffer.KPIN = fields[1];
                      GoodRowBuffer.KPID = fields[2];
                      GoodRowBuffer.PI = fields[3];
                      GoodRowBuffer.Obj = fields[4];
                      GoodRowBuffer.SID = fields[5];
                      GoodRowBuffer.KPIC = fields[6];
                      GoodRowBuffer.KPIMT = fields[7];
                  }
                  else // bad row
                  {
                      BadRowBuffer.AddRow();
      
                      BadRowBuffer.AllFields = line;
                  }
      
              }
          }
      }
      
      1. 测试代码:在您放置脚本组件的正下方添加两个Union All组件。将一个命名为GoodRows,另一个命名为BadRows。将Script组件的两个输出连接到这些Union All组件。放数据查看器。
      2. 希望这对你有所帮助。请告诉我们。

        PS:当您将脚本组件添加为源时,会有一个默认输出。删除它,然后创建上面提到的两个输出。我知道你会这样做,但只是为了确保......