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?
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.
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?
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")