gbv / Catmandu-PICA

Catmandu modules for working with PICA+ data
https://metacpan.org/release/Catmandu-PICA
Other
4 stars 4 forks source link

sequence of local (1...) and item (2...) data get mixed by occurence on conversion #69

Closed jorol closed 3 years ago

jorol commented 4 years ago

If I convert a PICA-XML record with data on all three levels (0..., 1... and 2....) elements of level 1 and 2 get mixed:

catmandu convert PICA --type XML to PICA --type Plain < xml_testfile.xml
  ...
  <datafield tag="101@">
    <subfield code="a">11</subfield>
  </datafield>
  <datafield tag="101B">
    <subfield code="0">11-09-10</subfield>
    <subfield code="t">16:50:01.000</subfield>
  </datafield>
  <datafield tag="101C">
    <subfield code="0">11-09-96</subfield>
    <subfield code="b">0001/0000</subfield>
  </datafield>
  <datafield tag="101D">
    <subfield code="0">11-09-10</subfield>
    <subfield code="b">touchark</subfield>
    <subfield code="a">0001</subfield>
  </datafield>
  <datafield tag="101U">
    <subfield code="0">utf8</subfield>
  </datafield>
  <datafield tag="145S" occurrence="11">
    <subfield code="a">Nx 6589</subfield>
    <subfield code="b">Nx 06589</subfield>
    <subfield code="9">086974076</subfield>
    <subfield code="a">Nx 6301 - Nx 6769</subfield>
  </datafield>
  <datafield tag="147B" occurrence="05">
    <subfield code="a">Auch als Mikroform vorhanden</subfield>
  </datafield>
  <datafield tag="147B" occurrence="09">
    <subfield code="a">ab</subfield>
  </datafield>
  <datafield tag="147I">
    <subfield code="a">kaz</subfield>
  </datafield>
  <datafield tag="201@" occurrence="01">
    <subfield code="a">Benutzung nur im Lesesaal|Standort unbekannt, wenden Sie sich an die Theke</subfield>
    <subfield code="b">0</subfield>
    <subfield code="e">365403148</subfield>
    <subfield code="m">mon</subfield>
    <subfield code="f">1</subfield>
    <subfield code="u">Benutzung nur im Lesesaal</subfield>
    <subfield code="v">Standort unbekannt, wenden Sie sich an die Theke</subfield>
  </datafield>
  <datafield tag="201B" occurrence="01">
    <subfield code="0">14-04-15</subfield>
    <subfield code="t">10:19:08.000</subfield>
  </datafield>
  <datafield tag="201D" occurrence="01">
    <subfield code="0">14-04-15</subfield>
    <subfield code="b">cbs_703</subfield>
    <subfield code="a">1999</subfield>
  </datafield>
  <datafield tag="201F" occurrence="01">
    <subfield code="0">0</subfield>
  </datafield>
  <datafield tag="201U" occurrence="01">
    <subfield code="0">utf8</subfield>
  </datafield>
  <datafield tag="203@" occurrence="01">
    <subfield code="0">365403148</subfield>
  </datafield>
  <datafield tag="208@" occurrence="01">
    <subfield code="a">01-01-71</subfield>
    <subfield code="b">k</subfield>
  </datafield>
  <datafield tag="209A" occurrence="01">
    <subfield code="f">1</subfield>
    <subfield code="a">4"@Nx 6589</subfield>
    <subfield code="d">s</subfield>
    <subfield code="x">00</subfield>
  </datafield>
  <datafield tag="209B" occurrence="01">
    <subfield code="a">D</subfield>
    <subfield code="x">69</subfield>
  </datafield>
  <datafield tag="209C" occurrence="01">
    <subfield code="a">D1280-630</subfield>
    <subfield code="x">90</subfield>
  </datafield>
  <datafield tag="220B" occurrence="01">
    <subfield code="a">Autopsie</subfield>
  </datafield>
  <datafield tag="220B" occurrence="01">
    <subfield code="a">Revision 2006 IIC2.1</subfield>
  </datafield>
  <datafield tag="237A" occurrence="01">
    <subfield code="a">Nur für den Lesesaal unter Aufsicht</subfield>
    <subfield code="a">In der Fernleihe nur als Mikrofiche benutzbar</subfield>
    <subfield code="a">Die Titelbl. für T. 2 sind hinter den Titelbl. von T. 1 eingebunden</subfield>
  </datafield>

vs,

...
101@ $a11
101B $011-09-10$t16:50:01.000
101C $011-09-96$b0001/0000
101D $011-09-10$btouchark$a0001
101U $0utf8
147I $akaz
201@/01 $aBenutzung nur im Lesesaal|Standort unbekannt, wenden Sie sich an die Theke$b0$e365403148$mmon$f1$uBenutzung nur im Lesesaal$vStandort unbekannt, wenden Sie sich an die Theke
201B/01 $014-04-15$t10:19:08.000
201D/01 $014-04-15$bcbs_703$a1999
201F/01 $00
201U/01 $0utf8
203@/01 $0365403148
208@/01 $a01-01-71$bk
209A/01 $f1$a4"@Nx 6589$ds$x00
209B/01 $aD$x69
209C/01 $aD1280-630$x90
220B/01 $aAutopsie
220B/01 $aRevision 2006 IIC2.1
237A/01 $aNur für den Lesesaal unter Aufsicht$aIn der Fernleihe nur als Mikrofiche benutzbar$aDie Titelbl. für T. 2 sind hinter den Titelbl. von T. 1 eingebunden
147B/05 $aAuch als Mikroform vorhanden
147B/09 $aab
145S/11 $aNx 6589$bNx 06589$9086974076$aNx 6301 - Nx 6769

Seems to be a problem with sorting by occurrence.

cKlee commented 4 years ago

Might be a problem with my sorting algorithm

https://github.com/gbv/PICA-Data/blob/master/lib/PICA/Writer/Base.pm#L46-L53

cKlee commented 4 years ago

If I remember correctly, the problem was after pica_add the sequence was incorrect. Therefore I created the sorting.

jorol commented 4 years ago

Should we remove this from the PICA::Writer::Base module and create a pica_sort fix, which could be used in combination with pica_add? This is how Catmandu::MARC implemented it.

cKlee commented 4 years ago

Yeah, that would be the best.

jorol commented 4 years ago

What is the right sorting for PICA records? I see at least two different sortings in the wild, e.g.:

001F $00
001U $0utf8
002@ $0Aaus
003@ $0282119914
006Y $0SBBT1255081
007G $cGBV$0282119914
007P $0ofgh e?en V.lo n*17 3 1791R
007S $0ESTC T140781
008@ $bBA
010@ $afre$aeng
011@ $a1791
019@ $aXA-GB
021A $aCatalogue Raisonné D'Une Collection Generale, De Pierres Gravées Antiques Et Modernes, Tant En Creux Que Camées$dTirées Des Cabinets Les Plus Celébres De L'Europe ; Moulées En Pâtes De Couleurs A L'Imitation Des Pierres, Emaux  Blancs, Et Soufres, Par Jacques Tassie, Sculpteur ; Orné De Planches Gravées. Au Quel On A Ajouté Un Discours Preliminaire Sur Les Differents Usages De Cette Collection, ...$hMis En Ordre Et Le Texte Rédigé Par R. E. Raspe
027A $aA @descriptive catalogue of a general collection of ancient and modern engraved gems, cameos as well as intaglios
027A/01 $aA @descriptive catalogue of engraved gems, &c.
028A $dRudolf Erich$aRaspe$9133366960$VTpv1$7gnd/118787888$wpiz$ARaspe$DRudolf Erich$E1736$M1794
028C $dJacques$aTassie$908136783X$VTpv1$7gnd/121531139$wpiz$ATassie$DJames$E1735$M1799
033A $pLondres$nTassie
033A $pLondres$nMurray
033A $pLondres$nBuckton
033D $pA Londres: Imprimeé Pour J. Tassie, Et Se Vend Chez Lui, No. 20, Leicester-Fields; Et Chez J. Murray, Libraire, No. 32, Fleet-Street. C. Buckton, Impremier, Great Pulteney Street
033J $9704963132$VTpv1$7gnd/120747472$wpiz$AMurray$DJohn$E1737$M1793
033J $9756147190$VTpv6$7gnd/1037588525$wpiz$ABuckton$DChristopher
034D $a[7] Bl., lxxiv S., [1] Bl., 800, 12, 50, 13 S., [1], LVII [i.e. LVIII] Bl.
034I $a4°
034M $aFrontisp. und Ill. (Kupferst.)
037A $aEnth. T. 1 - 2 in 1 Bd. - Titelbl. in Rot- und Schwarzdr. - Text engl. und franz.
044K $9106105086$VTsvz$7gnd/4068754-5$3209174544$aAntike$AARK
044K $9106319469$VTsv1$7gnd/4020059-0$3208931694$aGemme$AARK
044K $9105450375$VTsv1$7gnd/4164039-1$3209885599$aKlassische Archäologie$AARK
044S $909663328X$VTsv$aVerkaufskatalog
044S $9096630760$VTsv$aAltertumskunde
044S $909663314X$VTsv$aSubskribentenliste
045Q/01 $9106419749$VTkv$a15.17$jKlassische Archäologie$AARK
045Q/02 $9106404636$VTkv$a21.97$jKunsthandwerk$jKunstgewerbe: Sonstiges$AARK
046B $aParallelt.: A descriptive catalogue of a general collection of ancient and modern engraved gems, cameos as well as intaglios
046G $aAutopsie nach Ex. der SBB
046G $aFingerprint nach dem Ex. der FB Gotha
046X $Sschl$aSchlüsselseiten aus dem Exemplar der FB Gotha: Ant 4° 00685
047A $a***Durchgehende Bogen- und Seitenzählung <0001> 14-09-2006***
101@ $a11
101B $011-09-10$t16:50:01.000
101C $011-09-96$b0001/0000
101D $011-09-10$btouchark$a0001
101U $0utf8
145S/11 $aNx 6589$bNx 06589$9086974076$aNx 6301 - Nx 6769
147B/05 $aAuch als Mikroform vorhanden
147B/09 $aab
147I $akaz
201@/01 $aBenutzung nur im Lesesaal|Standort unbekannt, wenden Sie sich an die Theke$b0$e365403148$mmon$f1$uBenutzung nur im Lesesaal$vStandort unbekannt, wenden Sie sich an die Theke
201B/01 $014-04-15$t10:19:08.000
201D/01 $014-04-15$bcbs_703$a1999
201F/01 $00
201U/01 $0utf8
203@/01 $0365403148
208@/01 $a01-01-71$bk
209A/01 $f1$a4"@Nx 6589$ds$x00
209B/01 $aD$x69
209C/01 $aD1280-630$x90
220B/01 $aAutopsie
220B/01 $aRevision 2006 IIC2.1
237A/999 $aNur für den Lesesaal unter Aufsicht$aIn der Fernleihe nur als Mikrofiche benutzbar$aDie Titelbl. für T. 2 sind hinter den Titelbl. von T. 1 eingebunden

and

http://sru.k10plus.de/gvk?version=1.1&operation=searchRetrieve&query=pica.iss%3D1940-5758&maximumRecords=5&recordSchema=picaxml

001A $02004:19-03-08
001B $02004:09-06-19$t09:06:53.000
001D $02004:19-03-08
001U $0utf8
001X $00
002@ $0Obv
002C $aText$btxt
002D $aComputermedien$bc
002E $aOnline-Ressource$bcr
003@ $0560173172
003O $aOCoLC$0181102005$v2012-12-31
003S $0281383065
003T $aOCoLC$0984893878
003T $aOCoLC$01061064470
005A $01940-5758
006G $0987874829
006Z $02415107-5
007G $iZDB$02415107-5
010@ $aeng
011@ $a2007$n2007-
013D $910454466X$VTsvz$320917000X$7gnd/4067488-5$aZeitschrift
016A $0cr|uuu---uuuuu
017C $uhttp://journal.code4lib.org/$xH$4LF
017C $uhttp://www.bibliothek.uni-regensburg.de/ezeit/?2415107$xF
018@ $az
021A $aCode4Lib journal$dC4LJ
027A $aC4LJ
031@ $a1.2007 -
031N $d1$j2007$6
033A $p[S.l.]
034D $aOnline-Ressource
045G $a020$ADE-600
101@ $a62$cPICA
101B $016-09-17$t16:03:13.000
101U $0utf8
102D $016-09-17$bezblok$a2004
109R $uhttp://www.bibliothek.uni-regensburg.de/ezeit/?2415107&bibid=UBRO
101@ $a11$cPICA
201B/01 $016-09-19$t22:36:19.000
201U/01 $0utf8
202D/01 $016-09-19$b800$a1999
203@/01 $0865049009
206W/01 $0EZB8979006
208@/01 $a24-03-08$bb
209B/01 $a01$c10$dzz$x53
209O/01 $aOLR-EZB$x00
231@/01 $e1$j2007$6
231B/01 $alizenzfrei: 2007,1 -
201B/01 $014-12-16$t15:41:38.000
201U/01 $0utf8
202D/01 $014-12-16$b1687$a0001
203@/01 $01284097390
208@/01 $a22-12-11$bb5
209O/01 $aKERF EZB$x00
209R/01 $uhttps://rzblx1.uni-regensburg.de/ezeit/?2415107
237A/01 $aFreier Zugriff an Internetarbeitsplätzen
101@ $a63$cPICA
201B/01 $023-03-08$t21:49:12.000
201U/01 $0utf8
202D/01 $023-03-08$bezb2bib$a1999
203@/01 $0865041083
208@/01 $a23-03-08$bb
209O/01 $aOLR-EZB$x00
209R/01 $S1$uhttp://www.bibliothek.uni-regensburg.de/ezeit/?2415107&bibid=UBBUW
101@ $a65$cPICA
101B $030-04-16$t12:51:31.000
101U $0utf8
102D $030-04-16$bezblok$a2004
109R $uhttp://www.bibliothek.uni-regensburg.de/ezeit/?2415107&bibid=ULBH$B1
201B/01 $030-04-16$t12:51:31.000
201U/01 $0utf8
202D/01 $030-04-16$bezblok$a2004
203@/01 $0865054126
206W/01 $0EZB8979010
208@/01 $a30-04-16$bb
209B/01 $a01$c10$dzz$x53
209O/01 $aOLR-EZB$x00
231@/01 $e1$j2007$6
231B/01 $alizenzfrei: 2007,1 -
...

@nichtich Is this documented somewhere?

nichtich commented 4 years ago

I see at least two different sortings in the wild

the examples show different records, so where's the difference?

jorol commented 4 years ago

First record:

0.. 0.. 1.. 1.. 2.. 2..

Second record got level 1 and 2 mixed:

0.. 0.. 1.. 2.. 1.. 2..

nichtich commented 4 years ago

The second variant is the right one to keep the hierarchy 0-1-2

jorol commented 4 years ago

Ok. Do you know when occurrences are used for level 1 records, like in the first example?

101@ $a11
101B $011-09-10$t16:50:01.000
101C $011-09-96$b0001/0000
101D $011-09-10$btouchark$a0001
101U $0utf8
145S/11 $aNx 6589$bNx 06589$9086974076$aNx 6301 - Nx 6769
147B/05 $aAuch als Mikroform vorhanden
147B/09 $aab
147I $akaz
nichtich commented 4 years ago

Occurrences on level 0 and level 1 are part of the field identifier. Depending on the cataloguing rules, some fields have occurrence and some have not and some fields are defined with a range of occurrences (e.g. 147B/07-09 in K10plus), other fields just have a fixed occurrence (e.g. 147B/06).

nichtich commented 4 years ago

Answer from a colleauge:

To illustrate: with proper ordering we might have a full logical title (i.e. all level 0/1/2-records belonging to some PPN) that looks like this:

<level 0 (002@, 003@...)> <level 1 for iln 24 (101@, 101B... or maybe just 101@)> <level 2 occurrence 02 for iln 24 (201B/02, 203@/02...)> <level 2 occurrence 03 for iln 24 (201B/03, 203@/03...)> <level 2 occurrence 05 for iln 24 (201B/05, 203@/05...)> <level 1 for iln 42 (101@, 101B... or maybe just 101@)> <level 2 occurrence 01 for iln 42 (201B/01, 203@/01...)> <level 2 occurrence 03 for iln 42 (201B/03, 203@/03...)>

nichtich commented 3 years ago

Fixed in 1.04