0

平面文件内容:

ST*850*12500001|
BEG*00*NE*71249364**20130103|
CUR*SE*SGD|
REF*BT*SGL169816-7191416|
P01*0000000001*4*EA*0*CP*UP*731304265511*VP*SURT1000XLIQ|
P01*0000000002*10*EA*0*CP*UP*731304265511*VP*SURT1000XLIQ|
P01*0000000003*100*EA*0*CP*UP*731304265511*VP*SURT1000XLIQ|

文件的第一行

问题:

任何可以分享如何动态解析每个元素的想法的人。每个数据的长度有时会有所不同,例如:12500001、731304265511 和 SURT1000XLIQ。问题是如何获取星号 (*) 和管道 (|) 之间的数据。谢谢帮忙....

4

4 回答 4

1

您的平面文件看起来像EDI文件,但不是 EDIFACT。

有一些从 EDI 到 XML 的转换器(开源或商业),也许您可​​以尝试使用这样的工具来将生成的 xml 文件读取到 DataWindow 或数据存储中?

由于我不知道实际的文件格式,我不能更准确。

EDI -> XML 转换器示例:

编辑:我刚刚在 PowerBuilder Developer Journal 上发表了一篇关于同一主题的古老帖子:“将 X12 EDI 转换为 XML ”,它提供了额外的想法。

于 2013-04-14T17:15:25.977 回答
0

如果您使用的是普通的旧 PowerBuilder,那么基础就是做一堆 Pos() 和 Mid();没有什么自动的。但是,在您的标签中,您提到了 PFC;读入文件后,您始终可以引入字符串服务的 of_ParseToArray() 函数,例如(以下内容未经测试,由读者自行查找错误):

long ll_Line, ll_LineCount, ll_Element, ll_ElementCount
string ls_Lines[], ls_Elements[]
n_cst_String lnv_String  

ll_LineCount = lnv_String.of_ParseToArray (ls_FileContents, "|", ls_Lines)
FOR ll_Line = 1 TO ll_LineCount
   ll_ElementCount = lnv_String.of_ParseToArray (ls_Lines[ll_Line], "*", ls_Elements)
   // process the line with the elements separated out...
NEXT

祝你好运,

特里

于 2013-04-16T06:17:48.103 回答
0

那是一个 X12 文件,一个 850 采购订单。正如eppye在评论中所建议的那样,您需要确切地找出您获得的文件遵循的标准。为了帮助您入门,这里有一个 850版本。“Draft MEMA 4010 850”将帮助您了解格式。“GCommerce 4010 850V1.4.doc”是告诉您每个元素中的内容的数据字典。但请理解,除非您销售汽车零部件,否则这可能不是您正在使用的文件的确切规格。向您发送文件的人应将其提供给您。

我将为每个段和循环创建一个用户对象,一个代表采购订单本身。采购订单 UO 需要作为段和循环数据类型的变量。不要包括循环内的段,将它们放在循环的 UO 中。段的 UO 将具有段中数据元素的标准数据类型变量,如字符串、整数、日期等。有关数据类型,请参阅数据字典。

请注意,如果一个段重复,则保存该段的变量是一个数组。循环的变量将是数组。

处理段的对象将有一个方法,例如of_importLine,在星号处拆分行并存储值。

处理循环的对象将有一个方法,例如of_readLoop读取行(段)直到它读取循环的最后一段。对于每个段,它将为该类型的段创建 UO,将其分配给实例变量,或者如果段可以重复,则分配给下一个数组槽,并调用新对象的 of_importLine.

处理采购订单的对象类似于循环的对象,除了当它看到循环的第一段时,它会为这种循环创建 UO,将其分配给循环的下一个数组槽,并调用新对象的 of_readLoop。请注意,当您的采购订单对象在循环内读取时,它将创建一个新对象来读取和存储循环的每个重复。

如果缺少所需的段或找到不属于循环的段,则读取循环的对象应记录错误并停止。错误应包括行号和内容。我无法详细说明如何验证采购订单本身,因为许多部分在规范中是可选的,但它们在您的应用程序中可能不是可选的。对于每个段和循环,对象都有一个变量,它需要项目出现的顺序以及最小和最大出现次数。然后 PO 对象可以检查分段和循环。

这会将文档中的数据获取到表示文档部分的对象中,以便您可以使用数据。

于 2013-04-15T05:04:11.673 回答
0

以下是我得出的方法。

ls_tranidcode = of_trimdata(is_Message, 4, '*')
ids_edihdr.SetItem(ll_hdrins,'TRANSETIDCODE',ls_tranidcode)

Function:
of_trimdata()

Return Type : String 
Argument Type : 
String arg_msg
Integer pos1
String  s_dlm

Long ll_pos2
String ls_ret

arg_msg = mid(arg_msg, pos1)            
ll_pos2 = POS(arg_msg,s_dlm) 
ls_ret = Mid(arg_msg, 1, ll_pos2 - 1)
arg_msg = Mid(arg_msg, ll_pos2 + 1) 

RETURN ls_ret
于 2013-04-22T03:33:23.280 回答