没有任何第三方工具的EDI文件

时间:2012-10-29 17:13:58

标签: sql ssis

我正在获取EDI文件,如下所示,我需要处理它,我还需要维护主键,外键。

TH*4.2*857463*01**20091015*1045*P**~~IS*7564*ACME 
PHARMACY~PHA*1234567890~PAT*MA*06*987544****SMITH*JOHN****1234 MAIN 
ST**SOMEWHERE*MA*54356**19500101*M*01*01*INDIA**BURGER~

这里的列分隔符是*,如果没有提供任何值,它们也会放*。

我需要存储来自

的字段
TH*4.2*857463*01**20091015*1045*P**~~

分为1个表,分隔字段。

所以它会是

th01       th02       th03       th04   th05            th06      th07      th08   th09         th10
TH          4.2        857163     01     *(no value)    20091015   1045       p     * (novalue)  ~~

IS * 7564 * ACME PHARMACY到另一张表中,依此类推。

我无法使用第三方工具,因为我无法拥有xml文件

任何帮助?

确定。

这是我的vb.net代码

Public Enum Segments         TH         PHA         拍         IS1     结束枚举

Dim arrLine As String()
Dim segmentcode As String
Dim counter As Integer
Dim linenumber As Integer = 1
Dim segmenetsequence As Hashtable = New Hashtable()
Dim setid As Guid = Guid.NewGuid()






Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)

    arrLine = Row.LineText.Split("*"c)

    segmentcode = SegmentValue(arrLine, 0)
    Row.LineNumber = linenumber


    Row.Setid = setid

    counter = arrLine.Length
    linenumber += 1

    Select Case (segmentcode.ToUpper())

        Case Segments.TH.ToString.ToUpper()
            Row.TH01 = SegmentValue(arrLine, 1)
            Row.TH02 = SegmentValue(arrLine, 2)
            Row.TH03 = Convert.ToInt32(SegmentValue(arrLine, 3))
            Row.TH04 = SegmentValue(arrLine, 4)
            Row.TH05 = Convert.ToDateTime(SegmentValue(arrLine, 5))
            Row.TH06 = SegmentValue(arrLine, 6)
            Row.TH07 = SegmentValue(arrLine, 7)
            Row.TH08 = Convert.ToInt32(SegmentValue(arrLine, 8))
            Row.TH09 = SegmentValue(arrLine, 9)

        Case Segments.IS1.ToString.ToUpper()
            Row.IS01 = SegmentValue(arrLine, 1)
            Row.IS02 = SegmentValue(arrLine, 2)
            Row.IS03 = SegmentValue(arrLine, 3)

        Case Segments.PHA.ToString.ToUpper()

            Row.PHA01 = SegmentValue(arrLine, 1)
            Row.PHA02 = SegmentValue(arrLine, 2)
            Row.PHA03 = SegmentValue(arrLine, 3)
            Row.PHA04 = SegmentValue(arrLine, 4)
            Row.PHA05 = SegmentValue(arrLine, 5)
            Row.PHA06 = SegmentValue(arrLine, 6)
            Row.PHA07 = SegmentValue(arrLine, 7)
            Row.PHA08 = SegmentValue(arrLine, 8)
            Row.PHA09 = SegmentValue(arrLine, 9)
            Row.PHA10 = SegmentValue(arrLine, 10)
            Row.PHA11 = SegmentValue(arrLine, 11)
            Row.PHA12 = SegmentValue(arrLine, 12)


        Case Segments.PAT.ToString.ToUpper()

            Row.PAT01 = SegmentValue(arrLine, 1)
            Row.PAT02 = SegmentValue(arrLine, 2)
            Row.PAT03 = SegmentValue(arrLine, 3)
            Row.PAT04 = SegmentValue(arrLine, 4)
            Row.PAT05 = Convert.ToInt32(SegmentValue(arrLine, 5))
            Row.PAT06 = SegmentValue(arrLine, 6)
            Row.PAT07 = SegmentValue(arrLine, 7)
            Row.PAT08 = SegmentValue(arrLine, 8)
            Row.PAT09 = SegmentValue(arrLine, 9)
            Row.PAT10 = SegmentValue(arrLine, 10)
            Row.PAT11 = SegmentValue(arrLine, 11)
            Row.PAT12 = SegmentValue(arrLine, 12)
            Row.PAT13 = SegmentValue(arrLine, 13)
            Row.PAT14 = SegmentValue(arrLine, 14)
            Row.PAT15 = SegmentValue(arrLine, 15)
            Row.PAT16 = SegmentValue(arrLine, 16)
            Row.PAT17 = SegmentValue(arrLine, 17)
            Row.PAT18 = Convert.ToDateTime(SegmentValue(arrLine, 18))
            Row.PAT19 = SegmentValue(arrLine, 19)
            Row.PAT20 = Convert.ToInt32(SegmentValue(arrLine, 20))
            Row.PAT21 = Convert.ToInt32(SegmentValue(arrLine, 21))
            Row.PAT22 = SegmentValue(arrLine, 22)
            Row.PAT23 = SegmentValue(arrLine, 23)
            Row.PAT24 = SegmentValue(arrLine, 24)




    End Select



End Sub

Public Function SegmentValue(ByRef LineArray As String(), ByVal Counter As Integer) As String
    Throw New NotImplementedException

    If LineArray.Length > Counter Then
        Return LineArray(Counter).ToString().Trim()

    End If
    Return String.Empty

End Function

结束班

1 个答案:

答案 0 :(得分:0)

从广义上讲,我会考虑使用脚本组件作为源。它会有一个文件可能包含的每个“东西”的输出集合。在您的示例中,您将Output 0有足够的列来描述上面的th行。然后,您将拥有一个描述Output 1数据集的IS集合。您还需要考虑任何键,可能是源组件中生成的代理键,以跟踪您的数据。

一旦定义了集合中的所有列,那么在C#/ VB.NET中编写解析逻辑就很简单了。解析后,您只需将值分配给这些集合。

    Output0Buffer.AddRow();
    // use this to assign a value
    Output0Buffer.MyColumn = parsedValue;
    // Use this for handling a null value
    Output0Buffer.MyColumn_IsNull = true;

现在,您可以在流中运行包并解析数据流。

听起来你有外键可以满足并生成代理值。如果是这种情况,我会将大部分(如果不是全部)数据写入各种临时表,然后通过链接到数据流任务的执行SQL任务的重复查询继续验证和回填数据。

需要更多细节?编辑您的问题并自己提供一些。我们都很乐意提供建议和指导,但我们不在您的立方体中,也不了解您的需求。