2017-09-06 1 views
0

Ich versuche, Marc21 Binärdatensätze zu dekodieren, die die folgende Spezifikation bezüglich des Felds haben, die die Länge des Datensatzes bereitstellen.Marc21 Binary Decoder mit Akka-Stream

Eine computergenerierte, aus fünf Zeichen bestehende Zahl, die der Länge des gesamten Datensatzes entspricht, einschließlich sich selbst und den Satzabschluss. Die Nummer ist rechtsbündig und nicht verwendete Positionen enthalten Nullen.

Ich versuche, ich weiß nur nicht,

Akka Stream-Framing.lengthField jedoch zu verwenden, wie die Größe des Feldes angeben. Ich stelle mir vor, dass ein Charakter 8 Bit ist, vielleicht 16 für eine Zahl, ich bin mir nicht sicher, ob das von der Plattform oder der Sprache abhängt. Kurz gesagt, die Frage ist, dass es möglich ist, zu sagen, wie groß das Feld ist. Ich weiß, dass ich in Scala/Java bin.

Auch was tut Mittel:

Die Zahl rechtsbündig und nicht verwendete Positionen Nullen“

enthält, die Auswirkungen auf hat, wie man den Wert lesen, wenn sie richtig gesammelt

? Wenn jemand etwas darüber wissen, teilen Sie bitte.

EDIT1

Kontext:

Ich versuche, ein Stream-Verarbeitungs Diagramm, in dem die erste Stufe das Ergebnis eines sys Kommando gegen eine Symphonie (Katalogisierungssystem Vendor) Server lief Verarbeitung würde zu bauen, die ein Strom von unstrukturierten Byte chunck ist welche als Ganzes alle angeforderten Marc21-Datensätze (Volldump oder Partialdump) repräsentieren.

Durch die Verarbeitung ich meine, chunking, dass unstrukturierte Byte-Stream in einen Strom von Frames, wo die Frames die Datensätze sind.

Mit anderen Worten, bereiten Sie die Bytes für einen Datensatz zu der Zeit vor, und emittieren Sie einzeln für die nächste Stufe.

Die nächste Stufe besteht darin, diesen Datensatz (Bytes) an Apache Kafka zu senden.

Offensichtlich würde die Emissionsstufe vollständig parallelisiert werden, um den Prozess zu beschleunigen.

Der Symphony-Server verfügt nicht über die Fähigkeit, bei Bedarf einen Speicherauszug zu streamen, insbesondere über das Netzwerk. Daher ist diese akkastrombasierte Graph-Verarbeitung für die Durchführung dieser Arbeit, für die schnelle Aufnahme/Produktion und die gesamte Streaming-Verarbeitung unserer Dumps in unserer insgesamt schnellen Dateninfrastruktur geeignet.

EDIT2

Basierend auf @badcook Eingang, ich frage mich, ob ComputeFramesize hier verwendet werden könnte. Nicht sicher, ich bin etwas verwirrt von der Funktion und was braucht es in Parameter.

Wenig Klärung würde sehr geschätzt werden.

+0

In der Zukunft würde ich empfehlen, diese Art von Fragen in zwei Teile zu teilen und alle Informationen zur Hand zu haben. Ihre Frage zu 'Framing' in Akka ist völlig anders als Ihre (implizierte) Frage nach den MARC-Spezifikationen und gehört daher zu zwei getrennten Fragen. Sie haben MARC überhaupt nicht erwähnt, obwohl es ein entscheidender (wenn nicht * der * entscheidende) Teil Ihrer Frage ist. (Ich werde meine Downvote entfernen, wenn Sie zumindest MARC in Ihrer Frage und Ihrem Titel beschreiben). – badcook

Antwort

1

Es sieht so aus, als ob Sie versuchen, MARC 21 records zu analysieren.

In diesem Fall würde ich empfehlen, nur einen Blick auf MARC4J und verwenden Sie das.

Wenn Sie es mit Akka-Streams integrieren möchten, oder auch wenn Sie MARC-Records auf Ihre eigene Weise parsen möchten, empfehle ich Ihnen, Ihren Byte-Steam mit Framing.delimiter mit dem MARC 21-Record-Terminator (ASCII-Steuerzeichen 1D) zu zerlegen Vervollständigen Sie MARC-Datensätze, anstatt zu versuchen, mit Fragmenten von MARC-Datensätzen zu streamen und zu arbeiten. Es wird viel einfacher.

Wie für Ihre spezifischen Fragen: Die MARC 21 Spezifikation verwendet Zeichen und nicht rohe Bytes, wenn über seine Struktur gesprochen wird. Es gibt zwei Zeichenkodierungen in den Rohbytes, UTF-8 und MARC 8, an, bei denen es sich jeweils um Codierungen mit variabler Breite handelt. Daher ist es nicht wahr, dass jedes Zeichen ein Byte ist. Es gibt keine einzige Antwort darauf, wie viele Bytes ein Zeichen belegt.

"[R] iginierte und unbenutzte Positionen enthalten Nullen" ist eine andere Art zu sagen, dass Zahlen von links mit 0s aufgefüllt werden. In diesem Fall stammt diese Zeile aus einem größeren Zitat, wobei die numerische Zeichenkette 5 Zeichen lang sein muss. Das bedeutet, wenn Sie versuchen, die Zahl 1 darzustellen, müssen Sie sie als 00001 darstellen.

+0

Ich habe anfangs versucht, den framelimlimiter zu verwenden, aber diese Lösung hat überhaupt nicht funktioniert. Der Grund dafür ist, dass der Record Terminator kein Trennzeichen ist, sondern etwas, das im Datensatz enthalten ist. Mit anderen Worten, der Rahmen würde Rahmen ohne Aufzeichnungsbegrenzer zurückgeben. Dieses Pose-Problem für die spätere Analyse von lib wie marc4j. – MaatDeamon

+0

Wie mein vorheriger Kommentar nahelegt, ja, ich versuche marc21-Datensätze zu verarbeiten. Allerdings muss ich eine Stream-Verarbeitungskette aufbauen, in der das Lesen von marc21-Datensätzen der Anfang ist. – MaatDeamon

+0

Ich arbeite bereits mit marc4j. – MaatDeamon