- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在您叹气并抱头前,请理解我在相当紧迫的时间内使用一个非常旧的系统。
我们有一个用商业语言编写的单程 EDI 解析器。目前,包括循环级别、区域和每个段的名称的数据定义存储在数据库表中。该表还为区域内的每个段分配一个递增的序列号。例如,004010 810 Header 区域:
等等
因此,如果您按照段在标准中出现的顺序阅读段,我们可以说每个段都可以分配一个序号、一个“深度”(它出现了多少个“向下”循环)和一个名称(2-3 个字符)。
目前解析器遵循的算法如下:
Reset currentArea to 1
For each segment in the document
{
Search for the segment's name in the table restricting the area >= currentArea.
If not found, we have an error.
else
{
If the area changed
{
empty the temporary "search bounds" table. Create a single record with upper bound equal to MAX(sequence in current area) and lower bound equal to MIN(sequence in current area).
}
If the area did not change
{
Search for the next segment with a matching, but only within the bounds of the last "bounds" record created.
If the segment is found and the loop level changed as a result
{
Create a new bounds record with lower bound = MIN(sequence in current loop) and upper bound = MAX(sequence in current loop).
}
If the segment is not found within the searched bounds
{
"Pop" a bounds record out of the table to widen the search, repeat recursively until a segment having the same name is found.
}
}
}
}
不幸的是,我不确定我是否有时间或方法使用实际的文档模式来实现基于 XML 的解决方案。我目前正在研究几个这样的解析器,它们似乎能够根据模式神奇地安排 EDI,无论它看起来如何。
我面临的问题是:
在 945 文档中,详细信息区域如下所示(摘录):
<DETAIL>
<LX>
<MAN>
<PAL>
<N9>
<W12 (loop header)>
<G69>
...
<miscellaneous other segments>
...
<LS>
<LX (loop header)>
...
<miscellaneous other segments in LX loop>
...
<LE>
...
</DETAIL>
在我的原始数据中,我们有:
LX*1~MAN*GM*0000803225000421444452~N9*2I*12150-1~W12*CC*2*2*0*EA*101199007289*VN*10007~N9*李*1~LX*5~MAN*GM*0000803225000421444453~N9*2I*12150-2~...(其他部分)
基于上述算法,当命中第二个 LX 段时,当前存在从 W12 中的第一个段 (W12) 到 W12 中最后一个可能的段 (FA.FA2) 的“循环边界”记录。因此,当对文档的标准表执行搜索时,定义中要找到的下一个 LX 是在 W12 中打开其自身循环的 LX。这是错误的——细节区域实际上是在此处重置,LX 实际上是该区域的第一个段,而不是 W12.LX 循环的开始。由于解析器的天真性质,它无法区分这一点,因为它是基于循环的标准表自下而上的搜索。
更改解析器以查看区域的开始(自上而下)而不是当前模型会产生相反的问题。如果贸易伙伴实际上打算打开内部 W12.LX 循环,解析器会将其解释为新详细信息区域的开始。
是否可以使用使用我所描述的表中定义的标准的单 channel 解析器来解决这种情况?找到某种方法将 XML 解决方案侵入我们相当陈旧的系统是这里唯一的方法吗?由于 EDI 没有“结束标记”,我可以确定循环实际上结束的唯一方法是在文档中“展望”不可能发生的情况,例如内部 W12.LX 之后出现的 MAN 段(因为详细区域必须重置才能再次使用 MAN 段)。
我已无计可施,欢迎提出任何想法。
最佳答案
是的,这可以在单 channel 解析器中完成(我做到了)。
正如您所指出的,正确的循环级别应该在表中指出。
诀窍是让您跟踪自己在表格中的位置。
阅读一个新片段,在表格中查找。
从读取的表中的最后一段开始查找。
表格中的查找有些复杂:
1.新记录可以在同一个循环级别
2.可以重复相同的循环
3.循环可能已经结束,你需要进一步查看消息
如果没有找到,报错。
如果找到,转到传入文件中的新段等。
据我所知,如果分段/循环是强制性的或有条件的,则绝对必须在表中 - 如果您想要一个可以解析所有消息/事务类型的通用工具。
实际上你遇到的问题是 LS/LE 循环。第二个 LX 循环嵌入在 LS/LE 段中。 LS/LE 是为解决“碰撞”问题而发明的。如果在 LS 循环中,它应该以 LE 段结束。
关于xml - 没有 XML 模式的单 channel EDI 解析 - 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29392474/
我是 EDI 新手,必须在遗留系统中实现它。 我想确保我有正确的更高级别的概述: 1) 从我的系统为给定的贸易伙伴生成 EDI 文件 2) 可能 FTP 给他们 3) 响应是 ftp'd 给我的,
我已经编写了一个 EDI 文档生成器,它当前会在 ISA 段中填充小于所需字符数的所有字段,并在左侧添加空格,例如“1234567890”表示 15 个字符的元素。我有一位客户希望我在右侧填充空格。我
特别是 835 和 837,更具体地说,是各种状态代码及其含义的列表。 我通过 google 和 duckduckgo 找到了一些商业资源。是否有免费的资源? 谢谢。 最佳答案 这些规范的版权归 DI
我有一个 EDI 文件……我想测试它……所以当我打开它时,它会在 EXCEL 文件中打开,……有一些数据我想更改…… BGS~EGI~PG~265\TIA~5008~~~16796~GA\BGS~EG
69A8AB13 int 3 69A8AB14 int 3 69A8AB15 mov edi,edi 69A8AB17 push
我在 Windows 7 中单步执行结构化错误处理恢复代码(例如,SEH 处理程序完成并传回“CONTINUE”代码后会发生什么)。这是一个函数,它被称为: 7783BD9F mov
我的任务是检查进行内部EDI的可行性,因为第三者的成本已无法控制。 在对该主题进行网络搜索时,有很多有关各种文档类型和格式以及从XML或数据库文件创建它们的信息。这看起来非常简单。但是,在服务器与服务
我目前正在评估 smooks (www.smooks.org)。它看起来就像我们需要的,但我在使用一个简单的示例时遇到了问题。 我有一个 ant 脚本,它为我下载了所有依赖项,包括 EDIFACT 消
我以前读过XML或CSV,但从未见过像EDI这样的东西。 如何读取此文件并获取所需的数据?我看到〜,REF,N1,N2,N4之类的东西,但不知道这些东西是什么意思。 我看过有关x12的内容,但不知道那
我是 edi 数据的新手。我正在使用 smooks api 读取 edi 数据并能够将其解析为 java 对象。我想将 java 对象转换为 edi 数据,因为我没有得到太多信息。这是我试图从 edi
为什么在易于使用的技术面前仍然使用这种过时的格式?它提供我看不到的好处吗?似乎仍有许多供应商仅以这种格式提供数据,而不是像XML这样更易于管理和使用的内容;至少对我来说,提供两种格式都有意义。 此外,
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
我正在尝试将 EDI 210 提要导入我的 Web 应用程序。该应用程序安装在 Ubuntu linux 上,因此无论我的解决方案是什么,它都不能是一些仅适用于 Windoze 的虚假解决方案。 由于
我正在寻找有关将传入的 EDI 940 (X12) 转换为 c#.net 中的 (|) 管道分隔平面文件的任何有用链接或建议 最佳答案 对于一次翻译来说,我的技术可能看起来很重,但在这里: 步骤 #1
我正在实现 EDI-x12 header 解析器(仅解析“ISA”段)我注意到有几个字符集可以使用。 我的问题是,我如何知道传入的 edi-x12 消息使用了哪一个,以便我知道如何解释该消息? 最佳答
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我是 EDI 的新手,我有一个问题。 我已经读过,通过查看 ISA 行的最后 3 个字符,您可以获得有关 EDI 格式的大部分信息。如果每个 EDI 都使用换行符来分隔实体,这很好,但我发现许多是单行
我们的合作伙伴之一要求将“摘要”edi 消息附加到任何 EDI 发票交换(显然称为“发票列表”)。此消息包含每个单独发票的 RFF 段中应有的引用,以及累积的 MOA 值。 我的问题是:BizTalk
我是汇编的新手,试图理解以下函数的 objdump: int nothing(int num) { return num; } 这是结果(linux、x86-64、gcc 8): push
所以,这可能是一个有点具体的问题,但我的 ASM 任务是创建一个 10 元素数组,将第一个元素添加到最后一个元素,并将结果放入数组的第一个元素,然后是第二个元素元素与第 9 个元素并将结果放入数组的第
我是一名优秀的程序员,十分优秀!