0

我正在获取如下所示的 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 *(无价值) 20091015 1045 p *(无价值) ~~

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

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

有什么帮助吗?

好的。

这是我的 vb.net 代码

公共枚举段 TH PHA PAT 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

结束类

4

1 回答 1

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 任务的重复查询继续验证和回填数据。

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

于 2012-10-29T21:18:41.070 回答