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 列。
解决方法
- 在平面文件连接管理器中将整行读取为一列(仅添加类型为 DT_STR 且长度为 4000 的一列)
- 然后在数据流任务中添加一个脚本组件
- 添加类型为
DT_STR
的三个输出列 (a,b,c)
- 编写一个脚本来拆分每一行并将值放入列中(如果缺少一个值则为空)(我使用了 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
您也可以使用派生列转换来实现此目的
在 SSIS 中,我尝试从平面文件加载数据。 平面文件具有固定宽度的列,但有些列不在一行中(列可以有一个 CRLF,它必须是一个新行)像这样
a b c
the first rowok<CRLF>
iu jjrjdd<CRLF>
this is a newline<CRLF>
我如何才能在我的输出中拥有完全相同的行数和准确的数据?
我设置了一个平面文件连接,类型为 ragged right。
在这个示例中,正确检索了第 1 行,但对于第 2 行,它无法识别 CRLF,并将第 3 行全部放入 b 列。
解决方法
- 在平面文件连接管理器中将整行读取为一列(仅添加类型为 DT_STR 且长度为 4000 的一列)
- 然后在数据流任务中添加一个脚本组件
- 添加类型为
DT_STR
的三个输出列 (a,b,c)
- 编写一个脚本来拆分每一行并将值放入列中(如果缺少一个值则为空)(我使用了 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
您也可以使用派生列转换来实现此目的