【问题标题】:Write a file on mainframe server with ebcdic and packed decimal format使用 ebcdic 和压缩十进制格式在大型机服务器上编写文件
【发布时间】:2016-06-27 05:07:24
【问题描述】:

我之前用 SAS 程序在大型机上编写了一个文件(按列)。我想用 Java 实现类似的效果。

SAS 程序:

FILENAME fileReference ftp "'ThreadNum.ThreadType.NEW.AplicationFlag.J&feed_dt.'"
          RCMD='SITE TR PRI=20 SEC=20 RECFM=F LRECL=84'  HOST='host'
          USER="&user."  PASS="&pass."
          ;

  DATA _null_;
         SET MyDataSet ;
         name=0;
         pro='000';
         format custid 05. ;
         action='A ';
         flagcnt='01';
         FILE  fileReference LRECL=84 RECFM=f;
         PUT @01 num13    s370fpd07.
             @08 names    370fpd05.
             @13 pro      $ebcdic03.
             @16 action   $ebcdic02.
             @18 flag     $ebcdic02.
             @56 flagcnt  $ebcdic02.
             @70 num15    s370ff015.
         ;
       RUN;

所以基本上,我的问题是:

  1. ascii 值转换为ebcdics370fpd 格式。 (我明白了,s370fpd和COMP3一样)

  2. 直接在大型机服务器上写入文件,而不将其创建到本地服务器。我可以跳过这个问题,即使我们首先在本地创建一个具有所需编码的文件 asciiebcidic 并将 decimalftp 打包到大型机 - 我很好。

【问题讨论】:

  • "JAVA" 不是首字母缩写词。它只是“Java”。
  • 在我看来,您的“直接在大型机上”并不是您想的那样。 FTP。此外,您是否与大型机人员确认您在大型机(您的文件)上的数据集是否被“阻止”?未阻塞的 84 字节记录不会很好地执行,如果你有任何数量的记录,它会很明显。
  • @BillWoodger:数据集没有被阻止,我是唯一会写入它的用户。 LRECL=84 是 Maniframe 用户推荐的,我并不真正关心它。
  • 好的,不能太大。我认为您不知道在这种情况下阻塞是什么。如果您确实使用了大量数据,您就会知道。

标签: java mainframe


【解决方案1】:
  1. IBM 有处理大型机数据的软件包,请参阅 IBM Documentation,不确定它是否免费。
  2. 看看我的项目JRecord。您可以在中定义大型机记录
    • Cobol 字帖
    • Xml 文件说明
    • Java 代码。

在 JRecord 中,您可以定义字段和记录布局:

public class FieldNamesDtar020 {

    public static final RecordDtar020 RECORD_DTAR020 = new RecordDtar020();



    public static IFixedWidthIOBuilder newIoBuilder() {
        RecordDtar020 r = RECORD_DTAR020;
        return JRecordInterface1.FIXED_WIDTH.newIOBuilder()
                            .setFont("CP037")
                            .setFileOrganization(Constants.IO_FIXED_LENGTH)                        
                            .defineFieldsByLength()
                                .addFieldByLength(r.keycodeNo, Type.ftChar, 8, 0)
                                .addFieldByLength(r.storeNo, Type.ftPackedDecimal, 2, 0)
                                .addFieldByLength(r.date, Type.ftPackedDecimal, 4, 0)
                                .addFieldByLength(r.deptNo, Type.ftPackedDecimal, 2, 0)
                                .addFieldByLength(r.qtySold, Type.ftPackedDecimal, 5, 0)
                                .addFieldByLength(r.salePrice, Type.ftPackedDecimal, 6, 2)
                            .endOfRecord();    
}    

    public static class RecordDtar020 {
       public final String keycodeNo = "KEYCODE-NO";
       public final String storeNo = "STORE-NO";
       public final String date = "DATE";
       public final String deptNo = "DEPT-NO";
       public final String qtySold = "QTY-SOLD";
       public final String salePrice = "SALE-PRICE";

    }  
}

然后写入文件

        IIOBuilder iob = FieldNamesDtar020.newIoBuilder();
        AbstractLineWriter writer = iob.newWriter(filename);
        AbstractLine line = iob.newLine();

        writer.write(line);
        line.getFieldValue(rDtar020.keycodeNo).set("123");
        line.getFieldValue(rDtar020.storeNo).set(111);
          ...
        line.getFieldValue(rDtar020.salePrice).set)222);

        writer.close();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 2016-03-23
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多