2009-10-30 7 views
1

Je reçois des fichiers transférés d'un AS/400 à notre Windows (SBS 2003) via FTP. Les fichiers sont des données à largeur fixe. Le texte semble correct, mais certains des champs sont des décimales condensées qui, une fois décompactées, donnent de mauvaises valeurs. Mon hypothèse est qu'il y a une conversion EBCDIC-> ASCII implicite, qui convertit aussi les octets compressés. Cependant, faire la conversion inverse et les déballer donne toujours de mauvaises valeurs ... parfois.Déballage décimal emballé AS400 (BCD) - probablement borked par conversion EBCDIC?

Je suppose que la page de codes qu'ils utilisent est légèrement différente (donc quand je convertis en EBCDIC ce n'est pas pareil), mais je ne sais pas comment trouver quelle page de code sont en utilisant (leur Les informaticiens sont ... modérément récalcitrants ... sinon, ils pourraient simplement faire le FTP en mode binaire et ignorer tous ces problèmes).

Voici quelques exemples de données - elles sont supposées se décomposer en nombres à 8 chiffres qui sont en réalité des dates au format AAAAMMJJ.

Received: 
2,0,216,202,164 
2,0,144,22,177 
2,0,16,176,172 
2,0,16,176,172 
2,0,16,176,172 
2,0,16,176,172 
1,114,176,160,124 
2,0,248,32,63 
2,0,144,226,164 
2,0,144,226,164 
2,0,144,226,164 
2,0,144,202,124 
2,0,144,202,124 
2,0,144,176,172 
2,0,144,176,172 
2,0,32,22,63 
2,0,38,248,172 
2,0,38,248,172 
2,0,38,98,164 
2,0,233,1,15 
2,0,45,107,172 
1,114,176,226,26 
1,114,176,38,177 
1,114,176,97,164 
2,0,0,17,124 
2,0,128,129,31 
2,0,128,129,31 
2,0,128,129,31 
2,0,128,129,31 
2,0,128,129,31 
2,0,128,129,31 
2,0,216,17,63 
2,0,160,17,31 
2,0,160,128,34 
2,0,160,129,26 
2,0,38,128,31 
2,0,38,144,26 
1,114,97,16,124 
1,114,97,16,124 
2,0,38,234,26 
2,0,38,201,172 
2,0,45,38,124 
2,0,45,216,164 
2,0,45,107,177 
2,0,248,234,124 
2,0,248,202,34 
2,0,248,18,172 
2,0,97,128,172 
2,0,248,18,7 
2,0,248,233,15 
2,0,201,2,15 
2,0,176,16,7 
2,0,106,0,31 
2,0,216,22,34 
2,0,216,160,63 
2,0,38,107,7 
2,0,233,0,63 
2,0,38,107,164 
2,0,233,0,26 
2,0,38,107,34 
2,0,233,0,164 
2,0,233,17,15 
2,0,45,202,177 
2,0,45,106,7 
2,0,45,97,177 
2,0,47,16,31 
2,0,248,216,177 
2,0,201,0,172 
2,0,176,201,63 
2,0,248,97,34 
2,0,176,202,26 
2,0,248,97,34 
2,0,201,2,172 
2,0,201,17,164 
2,0,176,129,164 
2,0,201,17,172 
2,0,176,144,7 
2,0,145,2,164 
2,0,32,145,15 
2,0,38,45,26 
2,0,38,38,63 
2,0,38,233,26 
2,0,38,248,34 
2,0,45,202,164 
2,0,45,107,124 
2,0,47,17,15 
2,0,47,16,31 
2,0,47,130,34 
2,0,248,45,177 
2,0,106,0,31 
2,0,248,22,31 
2,0,248,202,172 
2,0,248,97,172 
2,0,47,128,177 
2,0,201,2,164 
2,0,216,201,164 
2,0,176,16,34 
2,0,216,201,34 

Voici le codepage reconvertir ebcdic qui n'est pas assez travail:

ascii = Array(_ 
&H0, &H1, &H2, &H3, &H37, &H2D, &H2E, &H2F, &H16, &H5, &H25, &HB, &HC, &HD, &HE, &HF, _ 
&H10, &H11, &H12, &H13, &H3C, &H3D, &H32, &H26, &H18, &H19, &H3F, &H27, &H1C, &H1D, &H1E, &H1F, _ 
&H40, &H4F, &H7F, &H7B, &H5B, &H6C, &H50, &H7D, &H4D, &H5D, &H5C, &H4E, &H6B, &H60, &H4B, &H61, _ 
&HF0, &HF1, &HF2, &HF3, &HF4, &HF5, &HF6, &HF7, &HF8, &HF9, &H7A, &H5E, &H4C, &H7E, &H6E, &H6F, _ 
&H7C, &HC1, &HC2, &HC3, &HC4, &HC5, &HC6, &HC7, &HC8, &HC9, &HD1, &HD2, &HD3, &HD4, &HD5, &HD6, _ 
&HD7, &HD8, &HD9, &HE2, &HE3, &HE4, &HE5, &HE6, &HE7, &HE8, &HE9, &H4A, &HE0, &H5A, &H5F, &H6D, _ 
&H79, &H81, &H82, &H83, &H84, &H85, &H86, &H87, &H88, &H89, &H91, &H92, &H93, &H94, &H95, &H96, _ 
&H97, &H98, &H99, &HA2, &HA3, &HA4, &HA5, &HA6, &HA7, &HA8, &HA9, &HC0, &H6A, &HD0, &HA1, &H7, _ 
&H20, &H21, &H22, &H23, &H24, &H15, &H6, &H17, &H28, &H29, &H2A, &H2B, &H2C, &H9, &HA, &H1B, _ 
&H30, &H31, &H1A, &H33, &H34, &H35, &H36, &H8, &H38, &H39, &H3A, &H3B, &H4, &H14, &H3E, &HE1, _ 
&H41, &H42, &H43, &H44, &H45, &H46, &H47, &H48, &H49, &H51, &H52, &H53, &H54, &H55, &H56, &H57, _ 
&H58, &H59, &H62, &H63, &H64, &H65, &H66, &H67, &H68, &H69, &H70, &H71, &H72, &H73, &H74, &H75, _ 
&H76, &H77, &H78, &H80, &H8A, &H8B, &H8C, &H8D, &H8E, &H8F, &H90, &H9A, &H9B, &H9C, &H9D, &H9E, _ 
&H9F, &HA0, &HAA, &HAB, &HAC, &HAD, &HAE, &HAF, &HB0, &HB1, &HB2, &HB3, &HB4, &HB5, &HB6, &HB7, _ 
&HB8, &HB9, &HBA, &HBB, &HBC, &HBD, &HBE, &HBF, &HCA, &HCB, &HCC, &HCD, &HCE, &HCF, &HDA, &HDB, _ 
&HDC, &HDD, &HDE, &HDF, &HEA, &HEB, &HEC, &HED, &HEE, &HEF, &HFA, &HFB, &HFC, &HFD, &HFE, &HFF) 
+0

Quelle langue utilisez-vous pour écrire le code pour les convertir? Il existe différentes solutions en fonction de la langue. – Jason

+0

Hélas, j'utilise VB6. – Dave

+0

Désolé d'être à l'écoute si tard; avez-vous trouvé cela résolu? Si ce n'est pas le cas, quels sont les exemples de données numériques qui viennent avec succès et d'autres qui ont des problèmes? (Vous avez dit que seuls certains résultats étaient mauvais ....) –

Répondre

0

Essayez d'utiliser les routines de conversion et les fonctions de conversion codepage requête & disponibles à VB fournie par la boîte à outils du programmeur , partie d'Access pour Windows.

Ce sont des objets ActiveX. Pas trop difficile à utiliser de VB.

(long) AS400System.HostCodePage // tells you the host's code page 
(object) PackedConverter   // convert between numeric strings and byte arrays 
(object) CodePageConverter  // convert text data between iSeries and PC code pages 
+0

Nous n'avons pas de licence pour cela - même si nous l'avons fait, vos exemples suggèrent d'avoir besoin d'une connexion active à leur système (pour déterminer la page de code), qui nous ne le faisons pas (et ne le ferons pas). – Dave

0

Désolé, ne connaissez pas beaucoup sur VB, beaucoup plus sur iSeries FTP. Le serveur FTP iSeries effectue en effet la traduction automatique d'EBCDIC en ASCII. FTP utilise les tables système QEBCDIC et QASCII pour cela. Vous pouvez trouver ces tables avec la commande WRKTBL.

Je vous suggère de vérifier les valeurs dans ces tableaux et de vérifier qu'ils correspondent à vos fichiers. Sinon, je pense que VB fait aussi de la conversion.

Important: Si le problème provient de l'iSeries, vous pouvez utiliser d'autres tables de traduction, ainsi qu'un autre jeu de caractères. Vous pouvez modifier ces valeurs dans la commande FTP (si vous envoyez à partir d'iSeries vers Windows ou le serveur FTP (si vous êtes autorisé à le faire)

Ce que vous ne devez JAMAIS faire est de changer les tables système vous n'avez pas peur du cœur ...) Copiez ces tables, changez ce que vous voulez et pointez vers ces nouvelles tables

En outre, étudier les commandes côté serveur de votre session FTP peut valoir la peine. session FTP local, vous pouvez demander à l'iSeries de faire beaucoup de choses pour vous. Ces commandes ne sont pas des commandes FTP standard, mais spécifiques iSeries.

Hope this helps.

1

Oui, la conversion EBCDIC - >> ASCII va bousiller les champs décimaux condensés car certains des octets du Packed Decimal seront convertis en ASCII. Comme vous l'avez découvert faire un EBCDIC - >> ASCII - >> ASCII ne fonctionnera pas car plusieurs caractères EBCDIC peuvent être mappés à un seul caractère ASCII et plusieurs caractères ASCII peuvent être mappés à un seul caractère EBCDIC. Généralement, cette erreur de traduction se produit pour aucun caractère d'affichage que vous trouverez dans un champ décimal condensé.

Les solutions sont 1) Déballez sur l'AS400 et trnsmit 2) faire un transfert binaire. Vous pouvez utiliser le RecordEditor (http://record-editor.sourceforge.net/) pour voir le fichier. Vous devriez alors pouvoir couper et coller les données dans un éditeur de texte, etc.

Remarque: Pour EBCDIC, utilisez CP037 (page codée 37 ou n'importe quelle page codée que vous utilisez). RecordEditor vous permet de définir des champs décimaux compressés. Champs Si vous avez un cahier Cobol; Vous pourriez essayer d'importer le Copybook comme un copybook de Mainframe (cela peut fonctionner ???)