我需要生成一个固定宽度的文件,其中包含少数压缩十进制格式的列和少数正常数字格式的列。我能够生成。我将文件压缩并传递给大型机团队。他们将其导入并解压缩文件并转换为 EBCDIC。他们能够毫无问题地获得压缩十进制列,但正常的数字字段似乎搞砸了并且不可读。在将文件发送到大型机之前,在处理/压缩文件时我需要做一些具体的事情吗?我正在使用 COMP3 压缩十进制。目前在 Windows XP 上工作,但真正的生产将在 RHEL 上。
提前感谢您帮助我。这是紧急的。
2011 年 6 月 6 日编辑:
这就是我打开 HEX 时的样子。
. . . . . . . . . . A . .
333333333326004444
210003166750C0000
第一行中的“A”有轻微的重音,所以它不是实际的大写 A。
210003166 是原始小数。comp3 转换之前的压缩十进制值是 000000002765000(如果需要,我们可以忽略前导零)。
更新 2:2011 年 6 月 7 日 这就是我如何转换创建加载到大型机中的文件:文件包含两列 - 标识号和数量。识别号不需要comp3转换,金额需要comp3转换。Comp3 转换在 oracle sql 结束时执行。这是执行转换的查询:
Select nvl(IDENTIFIER,' ') as IDENTIFIER, nvl(utl_raw.cast_to_varchar2(comp3.convert(to_number(AMOUNT))),'0') as AMOUNT from TABLEX where IDENTIFIER = 123456789
执行查询后,我在 Java 中执行以下操作:
String query = "Select nvl(IDENTIFIER,' ') as IDENTIFIER, nvl(utl_raw.cast_to_varchar2(comp3.convert(to_number(AMOUNT))),'0') as AMOUNT from TABLEX where IDENTIFIER = 210003166"; // this is the select query with COMP3 conversion
ResultSet rs = getConnection().createStatement().executeQuery(sb.toString());
sb.delete(0, sb.length()-1);
StringBuffer appendedValue = new StringBuffer (200000);
while(rs.next()){
appendedValue.append(rs.getString("IDENTIFIER"))
.append(rs.getString("AMOUNT"));
}
File toWriteFile = new File("C:/transformedFile.txt");
FileWriter writer = new FileWriter(toWriteFile, true);
writer.write(appendedValue.toString());
//writer.write(System.getProperty(ComponentConstants.LINE_SEPERATOR));
writer.flush();
appendedValue.delete(0, appendedValue.length() -1);
这样生成的文本文件由winzip工具手动压缩并提供给大型机团队。大型机团队将文件加载到大型机并使用 HEXON 浏览文件。
现在,来到分区十进制的高四位的转换,我应该在将它纠正到文件之前这样做吗?还是我要在大型机端应用翻转?目前,我已经使用以下代码在 java 端完成了翻转:
public static String toZoned(String num) {
if (num == null) {
return "";
}
String ret = num.trim();
if (num.equals("") || num.equals("-") || num.equals("+")) {
// throw ...
return "";
}
char lastChar = ret.substring(ret.length() - 1).charAt(0);
//System.out.print(ret + " Char - " + lastChar);
if (lastChar < '0' || lastChar > '9') {
} else if (num.startsWith("-")) {
if (lastChar == '0') {
lastChar = '}';
} else {
lastChar = (char) (lastChar + negativeDiff);
}
ret = ret.substring(1, ret.length() - 1) + lastChar;
} else {
if (num.startsWith("+")) {
ret = ret.substring(1);
}
if (lastChar == '0') {
lastChar = '{';
} else {
lastChar = (char) (lastChar + positiveDiff);
}
ret = ret.substring(0, ret.length() - 1) + lastChar;
}
//System.out.print(" - " + lastChar);
//System.out.println(" -> " + ret);
return ret;
}
标识符在 java 端变为 21000316F,这就是写入文件的内容。我已将文件传递给大型机团队并等待 HEXON 的输出。如果我遗漏了什么,请告诉我。谢谢。
更新 3:2011 年 6 月 9 日
好的,我得到了大型机结果。我现在正在这样做。
public static void main(String[] args) throws FileNotFoundException {
// TODO Auto-generated method stub
String myString = new String("210003166");
byte[] num1 = new byte[16];
try {
PackDec.stringToPack("000000002765000",num1,0,15);
System.out.println("array size: " + num1.length);
} catch (DecimalOverflowException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (DataException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
byte[] ebc = null;
try {
ebc = myString.getBytes("Cp037");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PrintWriter pw = new PrintWriter("C:/transformationTextV1.txt");
pw.printf("%x%x%x%x%x%x%x%x%x",ebc[0],ebc[1],ebc[2],ebc[3],ebc[4], ebc[5], ebc[6], ebc[7], ebc[8]);
pw.printf("%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x",num1[0],num1[1],num1[2],num1[3],num1[4], num1[5], num1[6], num1[7],num1[8], num1[9],num1[10], num1[11],num1[12], num1[13], num1[14],num1[15]);
pw.close();
}
我得到以下输出:
Á.Á.Á.Á.Á.Á.Á.Á.Á.................Ä
63636363636363636333333333333333336444444444444444444444444444444444444444444444
62616060606361666600000000000276503000000000000000000000000000000000000000000000
我一定是做错了什么!
更新 4:2011 年 6 月 14 日
在使用 James 的建议后,这个问题得到了解决。我目前正在使用下面的代码,它给了我预期的输出:
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String myString = new String("210003166");
byte[] num1 = new byte[16];
try {
PackDec.stringToPack("02765000",num1,0,8);
} catch (DecimalOverflowException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (DataException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
byte[] ebc = null;
try {
ebc = myString.getBytes("Cp037");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
FileOutputStream writer = new FileOutputStream("C:/transformedFileV3.txt");
writer.write(ebc,0,9);
writer.write(num1,0,8);
writer.close();
}