Csv aus wiederholten MARC-Feldern

Hallo,

ich möchte Daten aus MARC-records in eine Tabelle schreiben, wobei die zu schreibenden Felder zum Teil wiederholte Felder innerhalb der records sind.

Wie etwa “001”, “700”:

”123456”, “a”
”123456”, “b”
”123456”, “c”
”123456”, “d”
”223456”, “e”
”223456”, “a”
”223456”, “f”
”223456”, “g”

Kann es sein, dass das mit dem record-basierten FIX nicht möglich ist? So dass die Ausgabe nicht wesentlich verschieden sein kann von:

”123456”, “a, b, c, d, e”
”223456”, …

?

2 Likes

Hi @legehle

willkommen im Forum.

Ich helfe dir gerne.

Allgemein zum Übertragen von MARC nach CSV:

Beim Übertragen von Marc-Daten auf eine Flache Tabelle muss berücksichtigt werden, dass MARC-Daten Baum-Ähnlich sind, soll heißen es gibt Felder, die wiederholt werden können, und Unterfelder, die wiederholt werden können. Zusätzlich hat die Reihenfolge der Felder außer des Leaders und der Kontroll-Fellder (001-009) keine Relevanz für die Marc-Daten.

Die Csv-Daten oder Tabellen haben strikte Beschränkungen in der Reihenfolge und damit ist sehr relevant.

Soll heißen mit Blick auf die Datenstruktur sind Marc-Daten nicht einfach auf CSV Daten übertragbar. Ich glaube, dass hast du aber schon verstanden.

Mit Blick auf deinen Anwendungsfall:

Wenn ich es richtig verstehe, willst du in Spalte 1 als Ergebnis die Record Id (001) und in Spalte 2 eine Info aus 700 haben richtig. Dabei soll für jeden Wert im gewünschten Feld von 007 eine Zeile erzeugt werden? Richtig?

Die Struktur des Marc-Datensatzes würde dann aufgebrochen werden und für jeden Wert aus Feld 001 ein eigener Datensatz erzeugt werden?

Oder vertue ich mich da.

Hier im Playground mal eine Vorlage, in die du deine Fix einfügen kannst.

Kannst du mal deine Flux und Fix entsprechend übertragen. Du kannst gerne auch Datenbeispiele da ergänzen. Du könntest dann mit Share deine Transformation teilen.

Hi,

danke!

Blockquote
Wenn ich es richtig verstehe, willst du in Spalte 1 als Ergebnis die Record Id (001) und in Spalte 2 eine Info aus 700 haben richtig. Dabei soll für jeden Wert im gewünschten Feld von 007 eine Zeile erzeugt werden? Richtig?
Blockquote
Die Struktur des Marc-Datensatzes würde dann aufgebrochen werden und für jeden Wert aus Feld 001 ein eigener Datensatz erzeugt werden?

Ja, so meinte ich.

FLUX:
https://d-nb.info/1106253078/about/marcxml
| open-http(accept=„application/xml“)
| decode-xml
| handle-marcxml
| fix(transformationFile)
| encode-csv
| print
;

FIX:
copy_field(„001“,„id“)
copy_field(„700??.a“,„name“)
retain(„id“,„name“)

RESULT:
„1106253078“,„Vučković, Milica“,„Turajlić, Nina“,„Babarogić, Slađan“,„Aničić, Nenad“,„Marjanović, Zoran“

Du hattest in deinem Anfangsbeitrag eine gute Vermutung, der “record” basierte Ansatz erlaubt die Übertragung von MARC zu CSV nicht direkt, wenn man pro Urheber eine Zeile ausschreiben will.

ABER metafacture hat ein Konzept auf Flux ebene, das Triples genannt wird und mit dem man deine Anforderung erreicht. Triples bedeutet, dass einzelne Aussagen eines Datensates in eine Subjekt-Prädikat-Objekt Struktur übertragen wird, ähnlich zu RDF.

FLUX:

"https://d-nb.info/1106253078/about/marcxml"
| open-http(accept="application/xml")
| decode-xml
| handle-marcxml
| fix(transformationFile)
// Bestimme ein bestimmtes Element als Datensatz id
| change-id(idliteral="id")
// Mit dem Commando `stream-to-triples` können wir die Datensätze in einzelne Subjekt-Prädikat-Objekt-Triples zerlegen
// Damit können wir auch den Marc-Datensatz aufbrechen.
| stream-to-triples
| template("${s}\t${o}") // `template` erlaubt das Output von triples nach deiner Vorliebe zu arrangieren.
| print
;

FIX:

copy_field("001","id")
# Da wir nicht wissen, ob 700 einmal oder mehr mals vorkommt, sollten wir 700 als Liste behandeln
# und mit `do list` darüber iterieren und das neue Feld name als Liste erzeugen.
do list(path:"700??","var":"$i")
    copy_field("$i.a","name.$append")
end
retain("id","name")



OUTPUT:

1106253078	Vučković, Milica
1106253078	Turajlić, Nina
1106253078	Babarogić, Slađan
1106253078	Aničić, Nenad
1106253078	Marjanović, Zoran

Link zum Beispiel:

https://metafacture.org/playground/?flux=%22https%3A//d-nb.info/1106253078/about/marcxml%22%0A%7C+open-http%28accept%3D%22application/xml%22%29%0A%7C+decode-xml%0A%7C+handle-marcxml%0A%7C+fix%28transformationFile%29%0A//+Bestimme+ein+bestimmtes+Element+als+Datensatz+id%0A%7C+change-id%28idliteral%3D%22id%22%29%0A//+Mit+dem+Commando+%60stream-to-triples%60+k%C3%B6nnen+wir+die+Datens%C3%A4tze+in+einzelne+Subjekt-Pr%C3%A4dikat-Objekt-Triples+zerlegen%0A//+Damit+k%C3%B6nnen+wir+auch+den+Marc-Datensatz+aufbrechen.%0A%7C+stream-to-triples%0A%7C+template%28%22%24%7Bs%7D\t%24%7Bo%7D%22%29+//+%60template%60+erlaubt+das+Output+von+triples+nach+deiner+Vorliebe+zu+arrangieren.%0A%7C+print%0A%3B&transformation=%0Acopy_field%28%22001%22%2C%22id%22%29%0A%23+Da+wir+nicht+wissen%2C+ob+700+einmal+oder+mehr+mals+vorkommt%2C+sollten+wir+700+als+Liste+behandeln%0A%23+und+mit+%60do+list%60+dar%C3%BCber+iterieren+und+das+neue+Feld+name+als+Liste+erzeugen.%0Ado+list%28path%3A%22700%3F%3F%22%2C%22var%22%3A%22%24i%22%29%0A++++copy_field%28%22%24i.a%22%2C%22name.%24append%22%29%0Aend%0Aretain%28%22id%22%2C%22name%22%29%0A

PS:

man kann das template Kommando anpassen, dass du eine csv daraus machen würdest

1 Like

Danke für den interessanten Vorschlag!