2017-09-06 10 views
0

J'essaie de décoder les enregistrements de données binaires Marc21 qui ont la spécification suivante concernant le champ qui fournit la longueur de l'enregistrement.Décodeur binaire Marc21 avec Akka-Stream

Un nombre de cinq caractères généré par ordinateur égal à la longueur de l'enregistrement complet , y compris lui-même et la terminaison d'enregistrement. Le numéro est justifié à droite et les positions inutilisées contiennent des zéros.

Je suis en train d'utiliser

Akka flux Framing.lengthField, mais je ne sais pas comment spécifier la taille de ce champ. J'imagine qu'un personnage est 8 bits, peut-être 16 pour un nombre, je ne suis pas sûr, je me demande si cela dépend de la plate-forme ou de la langue. En bref, la question est est-il possible de dire quelle est la taille de ce champ Sachant que je suis en Scala/Java.

Aussi Que signifie:

Le nombre est droit et les positions inutilisées contiennent des zéros »

Est-ce que a une incidence sur la façon dont on lit la valeur si elles sont recueillies correctement

? Si quelqu'un sait quelque chose à ce sujet, s'il vous plaît partager

EDIT1

Contexte:

Je suis en train de construire un graphe de traitement de flux où la première étape serait en train de traiter le résultat d'une commande sys a couru sur un serveur symphonique (système de fournisseur de catalogage), qui est un flux de chunck octets non structuré qui dans l'ensemble représentent tous les enregistrements Marc21 demandés (vidage complet ou vidage partiel). Par traitement, je veux dire, découper ce flux non structuré d'octets en un flux de trames où les trames sont les enregistrements. En d'autres termes, en préparant les octets pour un enregistrement à la fois, et en l'émettant individuellement à l'étape suivante.

La prochaine étape consistera à émettre cet enregistrement (Bytes) à Apache Kafka.

Évidemment, l'étage d'émission serait complètement parallélisé pour accélérer le processus.

Le serveur Symphony n'a pas la capacité de diffuser un cliché sur demande, en particulier sur le réseau. Par conséquent, ce traitement graphique basé sur Akka-stream pour effectuer ce travail, pour l'ingestion rapide/production et le traitement global de streaming de nos décharges dans notre infrastructure de données rapide globale.

EDIT2

D'après les commentaires de @badcook, je me demande si ComputeFramesize pourrait être utilisé ici. Pas sûr que je suis légèrement confus par la fonction et que faut-il en paramètres.

Une petite précision serait grandement appréciée.

+0

À l'avenir, je recommanderais de diviser ce genre de questions en deux et en incluant toutes les informations disponibles. La question de votre flux Akka sur 'Framing' est complètement différente de votre question (implicite) sur les spécifications MARC et appartient donc à deux questions distinctes. Vous n'avez pas mentionné MARC du tout, même si c'est une partie cruciale (sinon * cruciale) de votre question. (Je vais retirer mon vote si vous au moins décrire et inclure MARC dans votre question et titre) – badcook

Répondre

1

Il semble que vous essayez d'analyser MARC 21 records.

Dans ce cas, je vous recommande de jeter un oeil à MARC4J et de l'utiliser. Si vous voulez l'intégrer avec des flux Akka, ou même si vous voulez analyser les enregistrements MARC à votre guise, je vous recommande de décomposer votre octet avec Framing.delimiter en utilisant la terminaison d'enregistrement MARC 21 (caractère de contrôle ASCII 1D) dans compléter les notices MARC plutôt que d'essayer de diffuser et de travailler avec des fragments d'enregistrements MARC. Ce sera beaucoup plus facile.

En ce qui concerne vos questions spécifiques: La spécification MARC 21 utilise des caractères plutôt que des octets bruts lorsque vous parlez de sa structure. Il spécifie deux codages de caractères en octets bruts, UTF-8 et MARC 8, les deux étant des codages à largeur variable. Par conséquent, non, il n'est pas vrai que chaque caractère est un octet. Il n'y a pas de réponse unique au nombre d'octets qu'un personnage prend. "Les positions justifiées et inutilisées contiennent des zéros" est une autre façon de dire que les nombres sont remplis de gauche avec 0s. Dans ce cas, cette ligne provient d'une citation plus grande, en restant que la chaîne numérique doit avoir 5 caractères. Cela signifie que si vous essayez de représenter le chiffre 1, vous devez le représenter sous la forme 00001.

+0

J'ai d'abord essayé d'utiliser le frame.delimiter mais cette solution n'a pas fonctionné du tout. La raison en est que le terminateur d'enregistrement n'est pas un séparateur mais quelque chose qui est inclus dans l'enregistrement. En d'autres termes, la trame renvoie des trames sans terminateur d'enregistrement. Cela pose un problème pour l'analyse ultérieure par lib comme marc4j. – MaatDeamon

+0

Comme le suggère mon précédent commentaire, oui j'essaie de traiter les enregistrements marc21. Cependant, j'ai besoin de construire une chaîne de traitement de flux où la lecture des enregistrements marc21 est le début. – MaatDeamon

+0

Je travaille déjà avec marc4j. – MaatDeamon