SSIS 参差不齐的文件无法识别 CRLF

SSIS ragged file not recognized CRLF

在 SSIS 中,我尝试从平面文件加载数据。 平面文件具有固定宽度的列,但有些列不在一行中(列可以有一个 CRLF,它必须是一个新行)像这样

a    b      c
the  first  rowok<CRLF>
iu   jjrjdd<CRLF>
this is a   newline<CRLF>

我如何才能在我的输出中拥有完全相同的行数和准确的数据?

我设置了一个平面文件连接,类型为 ragged right。

在这个示例中,正确检索了第 1 行,但对于第 2 行,它无法识别 CRLF,并将第 3 行全部放入 b 列。

解决方法

  1. 在平面文件连接管理器中将整行读取为一列(仅添加类型为 DT_STR 且长度为 4000 的一列)

  1. 然后在数据流任务中添加一个脚本组件
  2. 添加类型为 DT_STR
  3. 的三个输出列 (a,b,c)

  1. 编写一个脚本来拆分每一行并将值放入列中(如果缺少一个值则为空)(我使用了 vb.net)

制表符分隔的列

    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)


        If Not Row.Column0_IsNull AndAlso
                Not String.IsNullOrEmpty(Row.Column0.Trim) Then

            Dim str() As String = Row.Column0.Split(CChar(vbTab))


            If str.Length >= 3 Then

                Row.a = str(0)
                Row.b = str(1)
                Row.c = str(2)

            ElseIf str.Length = 2 Then

                Row.a = str(0)
                Row.b = str(1)
                Row.c_IsNull = True

            ElseIf str.Length = 1 Then


                Row.a = str(0)
                Row.b_IsNull = True
                Row.c_IsNull = True



            Else

                Row.a_IsNull = True
                Row.b_IsNull = True
                Row.c_IsNull = True


            End If




        Else

            Row.a_IsNull = True
            Row.b_IsNull = True
            Row.c_IsNull = True

        End If


    End Sub

固定宽度列

Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)


    If Not Row.Column0_IsNull AndAlso
                Not String.IsNullOrEmpty(Row.Column0.Trim) Then

        'Assuming that
        'Col a => 0-5
        'Col b => 5-15
        'Col c => 15-

        Dim intlength As Integer = Row.Column0.Length



        If intlength <= 5 Then

            Row.a = Row.Column0
            Row.b_IsNull = True
            Row.c_IsNull = True

        ElseIf intlength > 5 AndAlso intlength <= 15 Then


            Row.a = Row.Column0.Substring(0, 5)
            Row.b = Row.Column0.Substring(5, 10)
            Row.c_IsNull = True

        ElseIf intlength > 15 Then

            Row.a = Row.Column0.Substring(0, 5)
            Row.b = Row.Column0.Substring(5, 10)
            Row.c = Row.Column0.Substring(15)

        End If



    Else

        Row.a_IsNull = True
        Row.b_IsNull = True
        Row.c_IsNull = True

    End If


End Sub

您也可以使用派生列转换来实现此目的