【发布时间】:2016-04-24 14:04:57
【问题描述】:
我手上有一个难题。 我有一个定期导入 csv 文件的包,现在我有一个要导入的添加文件,但是这个文件的结构是挑战。
对于所有以前的文件,标题都在第 1 行,下面的数据没有问题。新文件有 2 组 headers,基本上第 1 行有 2 个 headers Level 和 Data,第 2 行有这 2 个 headers 的详细信息。
第 3 行有一组新的标题,第 4 行下面有所有其他需要的数据。
例子:
Month End Level
201501 CHEESE
Region Site Pricing Brand
Gauteng Billys 100 Gouda
ECape BeaconBay 150 Feta
现在 SSIS 包我有循环通过多个污点来查找文件,然后导入到正确的表中,这些新文件将获得一个新表,但我不知道如何正确读取它们。我需要提取日期和级别,以及第 4 行的数据,以及第 3 行的标题。
我当前的包有一个文件循环来查找所有文件,将文件路径和名称添加为变量 (User::File) 并将其用于数据流。
但是我如何处理文件以允许读取文件(动态 - 格式不会改变,我无法在导入前调整源文件)并将带有日期和级别的行正确添加到表中(数据流中的 Region_Data)。我认为它必须是在平面文件源上设置的东西?还是要包括其他步骤?
提前感谢所有帮助。
----在@MiguelH 的帮助下,我目前有这个设置。 (我将 Visual Studio 工具用于应用程序(VB 2010)
使用的脚本是:
#Region "Imports"
Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
#End Region
<Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute()> _
<CLSCompliant(False)> _
Public Class ScriptMain
Inherits UserComponent
Dim StrMonthend As String
Dim StrLevel As String
Public Overrides Sub myInput_ProcessInputRow(ByVal Row As MyInputBuffer)
do_output(Row.MyField)
End Sub
Public Sub do_output(ByRef data As String)
Dim splitz() As String
splitz = Split(data, ",")
If splitz(0) <> "Month End" And splitz(0) <> "Region" Then
With myoutputBuffer
.AddRow()
If UBound(splitz) < 2 Then
.MonthEnd = splitz(0)
.Level = splitz(1)
StrMonthend = splitz(0)
StrLevel = splitz(1)
.Brand = ""
.Description = ""
.Size = "0"
.VAT = "0"
.UnitsLY = "0"
.UnitsTY = "0"
.UnitsGrowth = "0"
.SalesInclLY = "0"
.SalesInclTY = "0"
.SalesInclGrowth = "0"
.SPInclLY = "0"
.SPInclTY = "0"
.SPInclGrowth = "0"
.Contrib = "0"
.BuyInd = "0"
Else
.MonthEnd = StrMonthend
.Level = StrLevel
.Brand = splitz(0)
.Description = splitz(1)
.Size = splitz(2)
.VAT = splitz(3)
.UnitsLY = splitz(4)
.UnitsTY = splitz(5)
.UnitsGrowth = splitz(6)
.SalesInclLY = splitz(7)
.SalesInclTY = splitz(8)
.SalesInclGrowth = splitz(9)
.SPInclLY = splitz(10)
.SPInclTY = splitz(11)
.SPInclGrowth = splitz(12)
.Contrib = splitz(13)
.BuyInd = splitz(14)
End If
End With
End If
End Sub
Public Overrides Sub PrimeOutput(ByVal Outputs As Integer, ByVal OutputIDs() As Integer, ByVal Buffers() As Microsoft.SqlServer.Dts.Pipeline.PipelineBuffer)
MyBase.PrimeOutput(Outputs, OutputIDs, Buffers)
End Sub
Public Overrides Sub CreateNewOutputRows()
End Sub
End Class
如果我删除 CLSComplient 行,我会得到: Error 01 随着 CLSComplient 线的输入或输出,我仍然会收到此错误。 Error 02
【问题讨论】:
-
我认为唯一的方法是使用脚本任务。
-
虽然有其自身的复杂性,但我的 VB 和 C 脚本知识还远远不够。
标签: sql-server import ssis