我使用edifact消息并开发了许多工具来帮助我解析和提取原始文件格式中的相关信息。
我一直在努力呈现原始的电子数据。我通常只是将消息复制到Microsoft Word中,查找并替换段分隔符,然后逐行查看内容。
我一直想以它的层次结构格式显示edifact文件,但却无法为我的一生想出一个这样做的方法。
下面是原始edifact消息的一个小摘录。
左侧显示如何获取数据(不包括行号),右侧显示如何根据客户规范显示数据。
01. UNA -UNA
02. UNB -UNB
03. UNH -UNH
04. BGM -BGM
05. DTM - | DTM
06. DTM - | DTM
07. DTM - | DTM
08. NAD - | NAD
09. NAD - | NAD
10. NAD - | NAD
11. GIS - | GIS
12. LIN - | | LIN
13. LOC - | | | LOC
14. LOC - | | | LOC
15. LOC - | | | LOC
16. RFF - | | | RFF
17. QTY - | | | QTY
18. QTY - | | | QTY
19. RFF - | | | | RFF
20. DTM - | | | | | DTM
21. SCC - | | | SCC
22. QTY - | | | | QTY
23. DTM - | | | | | DTM
24. DTM - | | | | | DTM
25. SCC - | | | SCC
26. QTY - | | | | QTY
27. DTM - | | | | | DTM
28. DTM - | | | | | DTM
29. SCC - | | | SCC
30. QTY - | | | | QTY
31. DTM - | | | | | DTM
32. QTY - | | | | QTY
33. DTM - | | | | | DTM
34. SCC - | | | SCC
35. QTY - | | | | QTY
36. DTM - | | | | | DTM
37. NAD - | | | NAD
38. CTA - | | | | CTA
39. COM - | | | | | COM
40. SCC - | | | | SCC
41. QTY - | | | | | QTY
42. UNT -UNT
43. UNZ -UNZ
您可以看到数据是基于树的,它是由发送给我的规范描述的。上述EDIFACT消息的一个规范如下:
Tag St Max Lvl
0000 1 UNA C 1 0 SERVICE STRING ADVICE
0000 2 UNB M 1 0 INTERCHANGE HEADER
0010 3 UNH M 1 0 MESSAGE HEADER
0020 4 BGM M 1 0 BEGINNING OF MESSAGE
0030 5 DTM M 10 1 DATE/TIME/PERIOD
0040 6 FTX C 5 1 FREE TEXT
0080 SG2 C 99 1 NAD
0090 7 NAD M 1 1 NAME AND ADDRESS
0190 SG6 C 9999 1 GIS-SG7-SG12
0200 8 GIS M 1 1 GENERAL INDICATOR
0210 SG7 C 1 2 NAD
0220 9 NAD M 1 2 NAME AND ADDRESS
0370 SG12 C 9999 2 LIN-LOC-FTX-SG13-SG15-SG17-SG22
0380 10 LIN M 1 2 LINE ITEM
0450 11 LOC C 999 3 PLACE/LOCATION IDENTIFICATION
0470 12 FTX C 5 3 FREE TEXT
0480 SG13 C 10 3 RFF
0490 13 RFF M 1 3 REFERENCE
0540 SG15 C 10 3 QTY-SG16
0550 14 QTY M 1 3 QUANTITY
0570 SG16 C 10 4 RFF-DTM
0580 15 RFF M 1 4 REFERENCE
0590 16 DTM C 1 5 DATE/TIME/PERIOD
0600 SG17 C 999 3 SCC-SG18
0610 17 SCC M 1 3 SCHEDULING CONDITIONS
0620 SG18 C 999 4 QTY-DTM
0630 18 QTY M 1 4 QUANTITY
0640 19 DTM C 2 5 DATE/TIME/PERIOD
0760 SG22 C 999 3 NAD-SG24-SG27
0770 20 NAD M 1 3 NAME AND ADDRESS
0830 SG24 C 5 4 CTA-COM
0840 21 CTA M 1 4 CONTACT INFORMATION
0850 22 COM C 5 5 COMMUNICATION CONTACT
0920 SG27 M 999 4 SCC-SG28
0940 SG28 M 999 5 QTY
0950 24 QTY M 1 5 QUANTITY
1030 25 UNT M 1 0 MESSAGE TRAILER
0000 26 UNZ M 1 0 INTERCHANGE TRAILER
重要的列是TAG,St(m=强制,C=条件),马克斯(最大时间可以重复),LVL(在树中有多深)。
以SG开头的标记表示有一个循环
我面临的问题是格式非常灵活,其中可以有条件段、条件循环、重复段。我一直在想一个能处理这一切的方法。
从上述规范的顶部开始,您可以立即看到,当您使用dtm标记时,它最多可以重复10次。在示例edifact消息中,它只在第5、6、7行出现3次。按照规范,ftx可能出现,但不在我的示例消息中,然后有一个sg2标记,这意味着下面的nad标记可能重复99次。
在lin标签内稍微向前移动(在sg12组下,可以重复9999次,并且在许多情况下确实重复了很多次),就到了第一个qty标签。
根据规范,该段可以有条件群(SG15)RFF和一个DTM使用我的示例,您可以在第17行和第18行看到它有数量段,但第18行也有这个条件组。
类似的事情也会在你研究scc段时发生。
我的想法是,能够将该规范输入某种文件格式,然后根据该规范的规则运行原始EDIFACT消息,因此输出是基于层次结构的,因此很容易一目了然地看到哪些数据与哪个段相关,以及检查EDIFACT消息是否有效的方法。
我有麻烦的是,实际的算法或过程来做转换。
我尝试过一些天真的方法,比如一行行一行地走,但是当我试图弄清楚当前行是在一个组中,还是在重复什么的时候,它变得很混乱。
我尝试了一种递归方法,将整个edifact按最大的组(sg12-lin组)拆分,然后递归地处理它们中的每个拆分并生成一个输出。这是我迄今为止最好的方法,但由于我的逻辑不正确,它仍然远远不能处理许多错误的读数。
我基本上需要能够选择一段消息,并确定它应该在层次结构中的位置和显示它。
我不知道怎么解决这个问题。我相信有一个很好的简单的方法来做这件事,但我只是不能解决它。
任何帮助都将不胜感激。
稍有更新。
我已经按照上述规范的层次结构将规范转换为XML文件。这个XML文件现在包含所有组和与每个标记相关的各种属性。现在我开始了解edifact也需要遵循什么。
如果我在纸上(和头上)浏览它,我可以用一点前瞻性的思考来构建输出,所以我的新想法是在EDIFACT文件中“向前扫描”,并构建一个可能基于结果的结果。
有点像一个国际象棋人工智能如何向前看几步。
最佳答案
你想做的大部分事情我都能帮你。但是在一张没有交互作用的小纸片上做这件事并不容易。
如果你想知道更多信息,请联系我。(不,这不是商业活动)