Cobol ItemReader and ItemWriter
richardmoore Jan 31, 2017 1:34 PMI have a requirement to process data from our legacy Cobol system with Cobol data (comp, comp-3, zoned decimal) formats. Do you have any suggestions or words of warning?
Here is what the code looks like that will do this. Should I do this with an ItemReader and Writer or just with a batchlet?
import java.text.SimpleDateFormat;
import java.util.Date;
import net.sf.JRecord.Common.Constants;
import net.sf.JRecord.Common.IFieldDetail;
import net.sf.JRecord.Details.AbstractLine;
import net.sf.JRecord.External.CopybookLoader;
import net.sf.JRecord.IO.AbstractLineReader;
import net.sf.JRecord.IO.CobolIoProvider;
import net.sf.JRecord.Numeric.ICopybookDialects;
public final class TaxDetTest {
private static final double GST_CONVERSION = 1.1;
private String installDir = "";
private String input = installDir + "GO.AGT.QAC070.SORT08.QACDET";
// private String output = installDir + "DTAR020out.bin";
private String copybookName = installDir + "TAXDETCC.cbl";
/**
* Example of LineReader / LineWrite classes
*/
private TaxDetTest() {
super();
int lineNum = 0;
double gstExclusive;
AbstractLine record;
try {
CobolIoProvider ioProvider = CobolIoProvider.getInstance();
AbstractLineReader reader = ioProvider.getLineReader(
Constants.IO_FIXED_LENGTH,
ICopybookDialects.FMT_OPEN_COBOL_MVS,
CopybookLoader.SPLIT_NONE,
copybookName,
input);
IFieldDetail dateField = reader.getLayout().getFieldFromName("TAXDET-DET-DATE");
IFieldDetail taxUnitField = reader.getLayout().getFieldFromName("TAXDET-DET-TAXUNIT");
IFieldDetail facField = reader.getLayout().getFieldFromName("TAXDET-DET-FAC");
//AbstractLineWriter writer = ioProvider.getLineWriter(reader.getLayout(), output);
while ((record = reader.read()) != null) {
lineNum += 1;
/*
Map<String, IFieldDetail> map = record.getLayout().getFieldNameMap();
for (String key : map.keySet()) { System.out.println(key + " = " + map.get(key).getType()); }
*/
Date d = inputDateFormat.parse(record.getFieldValue(dateField).asString());
System.out.println("[" + lineNum + "] " + SDF.format(d) + " " +
record.getFieldValue(taxUnitField).asBigDecimal() + " " +
record.getFieldValue(facField).asString());
/*
System.out.print(record.getFieldValue("KEYCODE-NO").asString() + " "
+ record.getFieldValue("QTY-SOLD").asString() + " "
+ record.getFieldValue("SALE-PRICE").asString());
gstExclusive = record.getFieldValue("SALE-PRICE").asDouble() / GST_CONVERSION;
record.getFieldValue("SALE-PRICE").set(gstExclusive);
writer.write(record);
System.out.println(" " + record.getFieldValue("SALE-PRICE").asString());
*/
}
reader.close();
//writer.close();
} catch (Exception e) {
System.out.println("~~> " + lineNum + " " + e.getMessage());
System.out.println();
e.printStackTrace();
}
}
public static void main(String[] args) {
new TaxDetTest();
}
private static final SimpleDateFormat inputDateFormat = new SimpleDateFormat("yyyyMMdd");
private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd");
}