いくつかの列がパック 10 進数形式で、いくつかの列が通常の数値形式である固定幅ファイルを生成する必要があります。生成できました。ファイルを圧縮して、メインフレーム チームに渡しました。彼らはそれをインポートしてファイルを解凍し、EBCDIC に変換しました。問題なくパック 10 進列を取得できましたが、通常の数値フィールドは混乱しているようで、読み取ることができませんでした。ファイルをメインフレームに送信する前に、ファイルを処理/圧縮する際に必要な特定のことはありますか? COMP3 パック 10 進数を使用しています。現在は Windows XP で作業していますが、実際の運用は RHEL で行う予定です。
助けてくれてありがとう。これは緊急です。
2011 年 6 月 6 日に編集:
HEXをONにするとこんな感じ。
. . . . . . . . . . A . .
333333333326004444
210003166750C0000
最初の行の「A」にはわずかなアクセントがあるため、実際の大文字の A ではありません。
210003166 は未加工の 10 進数です。comp3 変換前のパック 10 進数の値は 000000002765000 です (必要に応じて先行ゼロを無視できます)。
更新 2: 2011 年 6 月 7 日 これは、メインフレームにロードされるファイルを作成する際に変換する方法です。ファイルには、識別番号と金額の 2 つの列が含まれています。識別番号は 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 でファイルを参照します。
さて、ゾーン 10 進数の上位 4 ビットの変換についてですが、ファイルに正しく変換する前に変換する必要がありますか? または、メインフレーム側でフリッピングを適用する必要がありますか? 今のところ、次のコードを使用して 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 日
OK、メインフレームの結果が得られました。私は今これをやっています。
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();
}