2011-08-19 233 views
7

Tengo un archivo plano que se extrae de una tabla Db2, el archivo plano contiene registros tanto en formato char como en formato decimal empaquetado. Cómo convertir los datos empaquetados a una cadena Java. ¿Hay alguna forma de convertir todo el archivo plano en formato ASCII.convertir la cadena EBCDIC al formato ASCII?

Respuesta

1

Lea el archivo como una Cadena, escríbalo como EBCDIC. Use OutputStreamWriter y InputStreamWriter y proporcione la codificación en el constructor.

16

EBCDIC es una familia de codificaciones. Necesitará saber más en detalle qué codificación EBCDIC está buscando.

Java tiene una serie de supported encodings, incluyendo:

  • IBM500/CP500 - 500V1 EBCDIC
  • x-IBM834/Cp834 - IBM EBCDIC DBCS única coreana (doble byte)
  • IBM1047/Cp1047 - Conjunto de caracteres Latin-1 para hosts EBCDIC

Pruébalos y mira lo que obtienes. Algo como:

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

Hay que señalar que esta la lista es de las codificaciones admitidas por * Oracle JDK *. La lista de codificaciones [debe ser compatible con ** todas las JVM ** es mucho más corta] (http://download.oracle.com/javase/7/docs/api/java/nio/charset/Charset.html#standard) –

+0

¡Muy buen punto! – pap

1

Siguiendo de PAP, CP037 es la codificación EBCDIC de EE. UU.

También eche un vistazo a JRecord Proyecto. Le permite leer un archivo con una descripción Cobol o Xml y manejará EBCDIC y Comp-3.

Finalmente aquí es una rutina para convertir bytes decimales empaquetados en cadena véase el método getMainframePackedDecimal en Conversion

-1


compartir un código de ejemplo por mí para su referencia:

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

Creo que sería más útil para el OP y otros visitantes, cuando agregue alguna explicación a su intención. – reporter

Cuestiones relacionadas