2011-08-19 52 views
7

Tôi đang có một tệp phẳng được lấy từ bảng Db2, tệp phẳng chứa các bản ghi ở cả định dạng char cũng như định dạng thập phân được đóng gói. Cách chuyển đổi dữ liệu được đóng gói thành chuỗi java.is có bất kỳ cách nào để chuyển đổi toàn bộ tệp phẳng thành định dạng ASCII.chuyển đổi định dạng EBCDIC thành định dạng ASCII?

Trả lời

1

Đọc tệp dưới dạng Chuỗi, viết dưới dạng EBCDIC. Sử dụng OutputStreamWriter và InputStreamWriter và cung cấp mã hóa trong hàm tạo.

16

EBCDIC là họ mã hóa. Bạn sẽ cần phải biết thêm chi tiết mà EBCDIC mã hóa bạn đang sau.

Java có một số supported encodings, bao gồm:

  • IBM500/CP500 - 500V1 EBCDIC
  • x-IBM834/Cp834 - IBM EBCDIC DBCS-Hàn Quốc duy nhất (double-byte)
  • IBM1047/Cp1047 - Ký tự Latinh-1 được đặt cho máy chủ EBCDIC

Hãy thử những điều đó và xem những gì bạn nhận được. Một cái gì đó như:

InputStreamReader rdr = new InputStreamReader(new FileInputStream(<your file>), java.nio.Charset.forName("ibm500")); 
    while((String line = rdr.readLine()) != null) { 
     System.out.println(line); 
} 
+5

Cần lưu ý rằng điều này danh sách là các mã hóa được hỗ trợ bởi * Oracle JDK *. Danh sách mã hóa [cần được hỗ trợ bởi ** tất cả ** JVM ngắn hơn nhiều] (http://download.oracle.com/javase/7/docs/api/java/nio/charset/Charset.html#standard). –

+0

Điểm rất tốt! – pap

1

Sau PAP, CP037 là mã hóa EBCDIC của Hoa Kỳ.

Ngoài ra, hãy xem dự án JRecord. Nó cho phép bạn đọc một tệp với mô tả Cobol hoặc Xml và sẽ xử lý EBCDIC và Comp-3.

Cuối cùng đây là một thói quen để chuyển đổi byte thập phân đóng gói để String thấy phương pháp getMainframePackedDecimal trong Conversion

-1


Chia sẻ một số mẫu mã của tôi để bạn tham khảo:

package mypackage; 
    import java.io.UnsupportedEncodingException; 
    import java.math.BigInteger; 
    public class EtoA { 

public static void main(String[] args) throws UnsupportedEncodingException { 

    System.out.println("########"); 
    String edata = "/ÂÄÀ"; //Some EBCDIC string ==> here the OP can provide the content of flat file which the OP pulled from DB2 table 
    System.out.println("ebcdic source to ascii:"); 
    System.out.println("ebcdic: " + edata); 
    String ebcdic_encoding = "IBM-1047"; //Setting the encoding in which the source was encoded 
    byte[] result = edata.getBytes(ebcdic_encoding); //Getting the raw bytes of the EBCDIC string by mentioning its encoding 
    String output = asHex(result); //Converting the raw bytes into hexadecimal format 
    byte[] b = new BigInteger(output, 16).toByteArray(); //Now its easy to convert it into another byte array (mentioning that this is of base16 since it is hexadecimal) 
    String ascii = new String(b, "ISO-8859-1"); //Now convert the modified byte array to normal ASCII string using its encoding "ISO-8859-1" 
    System.out.println("ascii: " + ascii); //This is the ASCII string which we can use universally in JAVA or wherever 

    //Inter conversions of similar type (ASCII to EBCDIC) are given below: 
    System.out.println("########"); 
    String adata = "abcd"; 
    System.out.println("ascii source to ebcdic:"); 
    System.out.println("ascii: " + adata); 
    String ascii_encoding = "ISO-8859-1"; 
    byte[] res = adata.getBytes(ascii_encoding); 
    String out = asHex(res); 
    byte[] bytebuff = new BigInteger(out, 16).toByteArray(); 
    String ebcdic = new String(bytebuff, "IBM-1047"); 
    System.out.println("ebcdic: " + ebcdic); 

    //Converting from hexadecimal string to EBCDIC if needed 
    System.out.println("########"); 
    System.out.println("hexcode to ebcdic"); 
    String hexinput = "81828384"; //Hexadecimal which we are converting to EBCDIC 
    System.out.println("hexinput: " + hexinput); 
    byte[] buffer = new BigInteger(hexinput, 16).toByteArray(); 
    String eout = new String(buffer, "IBM-1047"); 
    System.out.println("ebcdic out:" + eout); 

    //Converting from hexadecimal string to ASCII if needed 
    System.out.println("########"); 
    System.out.println("hexcode to ascii"); 
    String hexin = "61626364"; 
    System.out.println("hexin: " + hexin); 
    byte[] buff = new BigInteger(hexin, 16).toByteArray(); 
    String asciiout = new String(buff, "ISO-8859-1"); 
    System.out.println("ascii out:" + asciiout); 
} 

//This asHex method converts the given byte array to a String of Hexadecimal equivalent 
public static String asHex(byte[] buf) { 
    char[] HEX_CHARS = "abcdef".toCharArray(); 
    char[] chars = new char[2 * buf.length]; 
    for (int i = 0; i < buf.length; ++i) { 
     chars[2 * i] = HEX_CHARS[(buf[i] & 0xF0) >>> 4]; 
     chars[2 * i + 1] = HEX_CHARS[buf[i] & 0x0F]; 
    } 
    return new String(chars); 
} 
} 
+1

Tôi nghĩ rằng nó sẽ hữu ích hơn cho OP và khách truy cập hơn nữa, khi bạn thêm một số giải thích cho sự căng thẳng của bạn. – reporter

Các vấn đề liên quan