2

有输入文件1:

 C1   C2        C3
 5102;22680372 =0000000001
 5111;21840112 =0000000002
 5363;21980235 =0000000002
 5363;22700216 =0000000001

输入文件 2:

 5111;21840112 =0000000002
 5363;21980235 =0000000001
 5363;22700216 =0000000001  

预期输出:应按以下方式排序,

   JOINKEYS FILES=F1,FIELDS=(1,04,A,6,8,A,16,10,a) 
   JOINKEYS FILES=F2,FIELDS=(1,04,A,6,8,A,16,10,a) 
   REFORMAT FIELDS=(F1:1,.. and... ) 

我需要这个 swquence 的输出文件

   File1 C1  File1 C2    file1C3     [file1C3 - file2 C3] value
   5102;     22680372   =0000000001  =00000             *(no records in second file for it)
   5111;     21840112   =0000000002  =00000             *(1-1 =0)
   5363;     21980235   =0000000002  =00001             *(2-1= 1)
   5363;      22700216  =0000000001  =00000             *(1-1 =0) 
  • 只是为了解释你现在正在尝试这个

    选项 COPY
    JOINKEYS F1=INA,FIELDS=(1,4,A,6,8,A)
    JOINKEYS F2=INB,FIELDS=(1,4,A,6,8,A)
    REFORMAT FIELDS=(F1:1, 25,F2:16,10)
    INREC BUILD=(1,25,26,10,SFF,SUB,36,10,SFF,EDIT=(STTTTTT))

结果:

   5060;22222222 =0000000001 (blank)  i just need 0001 - nothin(0) = 1 simply 1 here         
   5102;22680372 =0000000001;000000000
   5105;22222222 =0000000002 (blank)   need 2 here same 2-0 or nothing(unmatched) = 2         
4

1 回答 1

4

你很亲密。但是,不需要 SFF。这是有符号的自由格式,您有一个无符号的固定格式号码。使用 ZD。您的 EDIT 不足以容纳 10 位数字。如果您的结果永远不会(我的意思是永远不会)超过六位数,这不是问题。使用“=”,您无需生成任何代码,不清楚您希望该标志去哪里(目前它处于领先地位)。

到目前为止,您只会获得两个文件之间匹配的记录。你会需要:

 JOIN UNPAIRED,F1

在第二个 JOINKEYS 之后,如果您想在输出中来自 F1 的不匹配记录。

如果你没有匹配,减法就会有问题,所以你需要一些代码。您如何编码取决于您是否拥有DFSORTSyncSort.

如果是其中一个或两个输入文件,则应在适当的 JOINKEYS 语句中指定 SORTED。使用DFSORT,但不是SyncSort,您也可以指定 NOSEQCHK。

随着更多信息,我们取得进展:

  OPTION COPY 
  JOINKEYS F1=INA,FIELDS=(1,4,A,6,8,A) 
  JOINKEYS F2=INB,FIELDS=(1,4,A,6,8,A) 

  JOIN UNPAIRED,F1 

  REFORMAT FIELDS=(F1:1,25,F2:16,10),FILL=X'FF' 

  INREC IFTHEN=(WHEN=(35,1,CH,EQ,X'FF'), 
                 OVERLAY=(26:C'+',10C'0')), 
        IFTHEN=(WHEN=NONE, 
                     OVERLAY=(26:16,10,ZD,SUB,26,10,ZD, 
                              EDIT=(STTTTTTTTTT),SIGNS=(+,-))) 

UNPAIRED,F1意味着与配对记录(匹配)一起,来自 F1 的未配对记录被呈现给主任务。

REFORMAT语句定义主任务将使用的数据记录。在此示例中,包括了整个 F1 记录 (F1:1,25) 和 F2 中的 10 位数字 (F2:16,10)。

FILL=未配对记录的情况下,告诉 SORT 为任何缺失的记录设置什么值。在这种情况下,记录的 26,10REFORMAT将全部设置为 X'FF'。

IFTHEN=(WHEN=(logical-expression然后用于从 F2 数据中识别位于数字之一的 X'FF'。如果 X'FF' 存在,则不匹配。在这种情况下,来自 F2 的字节被设置为您实际想要的任何默认值。

IFTHEN=(WHEN=NONE对于任何不满足IFTHEN=(WHEN=(logical-expression. 计算完成,计算的输出被格式化。

如果任一输入文件已经按照您想要的顺序排列,请查看之前的建议。

如果您希望 Main Task 以不同的顺序输出,您只需编写一个 SORT 语句,然后删除 OPTION COPY。

您想要的确切输出格式尚不清楚,但您应该能够根据需要进行修复。

您需要获取 SyncSort 手册。它们以 PDF 格式免费提供给具有 SyncSort 许可证的站点。如果没有人知道如何为您提供一份手册,请找出谁是 SyncSort 的联系人,并让他们通过 SyncSort 支持部门索取手册。只需提供一些详细信息,您就会得到一份副本,可能是通过电子邮件返回。

于 2013-11-12T13:57:50.753 回答