marc4r 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/Gemfile +4 -0
  4. data/README.md +4 -0
  5. data/Rakefile +13 -0
  6. data/VERSION +1 -0
  7. data/lib/marc4r.rb +24 -0
  8. data/lib/marc4r/fields.rb +28 -0
  9. data/lib/marc4r/fields/control_field.rb +19 -0
  10. data/lib/marc4r/fields/data_field.rb +46 -0
  11. data/lib/marc4r/fields/subfield.rb +12 -0
  12. data/lib/marc4r/marc_stream_reader.rb +82 -0
  13. data/lib/marc4r/record.rb +92 -0
  14. data/marc4r.gemspec +21 -0
  15. data/spec/fixtures/OCLC_814388508.xml +123 -0
  16. data/spec/fixtures/bad_leaders_10_11.mrc +1 -0
  17. data/spec/fixtures/bad_too_long_plus_2.mrc +1 -0
  18. data/spec/fixtures/brkrtest.mrc +1 -0
  19. data/spec/fixtures/chabon.mrc +1 -0
  20. data/spec/fixtures/chabon.xml +116 -0
  21. data/spec/fixtures/chinese_mangled_multibyte.mrc +1 -0
  22. data/spec/fixtures/cruel-cruel-indicatorless-summerland.xml +55 -0
  23. data/spec/fixtures/cyrillic_capital_e.mrc +1 -0
  24. data/spec/fixtures/greekmissingcharsetchange.mrc +1 -0
  25. data/spec/fixtures/illegal-marc-in-json.json +401 -0
  26. data/spec/fixtures/legal-json-marc-in-json.json +380 -0
  27. data/spec/fixtures/loongboonmee.mrc +1 -0
  28. data/spec/fixtures/marc-in-json.json +380 -0
  29. data/spec/fixtures/marc-json.json +195 -0
  30. data/spec/fixtures/summerland-indented-marc-json.json +104 -0
  31. data/spec/fixtures/summerland-marc-in-json-indented.json +183 -0
  32. data/spec/fixtures/summerland-marc-in-json.json +1 -0
  33. data/spec/fixtures/summerland-marc-json.json +1 -0
  34. data/spec/fixtures/summerland.mrc +1 -0
  35. data/spec/fixtures/summerland.xml +52 -0
  36. data/spec/fixtures/u335.mrc +1 -0
  37. data/spec/lib/marc4r/fields/control_field_spec.rb +46 -0
  38. data/spec/lib/marc4r/fields/data_field_spec.rb +39 -0
  39. data/spec/lib/marc4r/marc_stream_reader.rb +19 -0
  40. data/spec/lib/marc4r/record_spec.rb +111 -0
  41. data/spec/spec_helper.rb +120 -0
  42. data/spec/test_constants.rb +22 -0
  43. data/tasks/marc4r-dev.rake +3 -0
  44. metadata +142 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d0a58b8d188bfed7b29da6dd0a2924a2364e0b98
4
+ data.tar.gz: f61c55be658daf6e9e74e49f8b52b9a2792a6334
5
+ SHA512:
6
+ metadata.gz: 6033e3fe5eb6d220953208ad7252c81f24fb757af0dc8c965a02ec0bba12da9b9e24286d497726a0bd802c2381416222fa3b79944446235e629c87d3cf9bd2a6
7
+ data.tar.gz: e2693eca537b27f9c69d5cbfe7a6744a765a0e5d8bd34e14e50d9e1be283a444374600639f0bc703e0243acf8dfcebabafe79750bb5cfd13c32042b68769cb93
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ *.java
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Please see marc4r.gemspec for dependency information.
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,4 @@
1
+ Marc4R is a ruby MARC parser based on fork of Marc4J
2
+ MARC Specification at http://www.loc.gov/marc/
3
+ Marc4J Fork at https://github.com/marc4j/marc4j
4
+ Marc4J Original Copyright 2005 Bas Peters, distributed under the LGPL
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env rake
2
+
3
+ begin
4
+ require 'bundler/setup'
5
+ rescue LoadError
6
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
7
+ end
8
+
9
+ Bundler::GemHelper.install_tasks
10
+
11
+ Dir.glob('tasks/*.rake').each { |r| import r }
12
+
13
+ task default: :spec
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
data/lib/marc4r.rb ADDED
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module Marc4R
3
+ MARCXML_NS_URI = "http://www.loc.gov/MARC21/slim"
4
+ autoload :Fields, 'marc4r/fields'
5
+ autoload :Record, 'marc4r/record'
6
+ autoload :MarcStreamReader, 'marc4r/marc_stream_reader'
7
+ module Terminators
8
+ RECORD_TERMINATOR = "\x1D"
9
+ FIELD_TERMINATOR = "\x1E"
10
+ SUBFIELD_TERMINATOR = "\x1F"
11
+ BLANK = "\x20"
12
+ end
13
+ module Encodings
14
+ # MARC-8 ANSEL ENCODING
15
+ MARC_8_ENCODING = "MARC8"
16
+
17
+ # ISO5426 ENCODING
18
+ ISO5426_ENCODING = "ISO5426"
19
+
20
+ # ISO6937 ENCODING
21
+ ISO6937_ENCODING = "ISO6937"
22
+ end
23
+ class MarcException < Exception; end
24
+ end
@@ -0,0 +1,28 @@
1
+ module Marc4R::Fields
2
+ autoload :ControlField, 'marc4r/fields/control_field'
3
+ autoload :DataField, 'marc4r/fields/data_field'
4
+ autoload :Subfield, 'marc4r/fields/subfield'
5
+ module Taggable
6
+ attr_accessor :tag
7
+ def <=>(compare)
8
+ if compare.is_a? Marc4R::Fields::Taggable
9
+ tag <=> compare.tag
10
+ else
11
+ super
12
+ end
13
+ end
14
+ end
15
+ module Datable
16
+ attr_accessor :data
17
+ def =~(pattern)
18
+ if data
19
+ data =~ pattern
20
+ else
21
+ nil
22
+ end
23
+ end
24
+ end
25
+ module Idable
26
+ attr_accessor :id
27
+ end
28
+ end
@@ -0,0 +1,19 @@
1
+ class Marc4R::Fields::ControlField
2
+ include Marc4R::Fields::Idable
3
+ include Marc4R::Fields::Taggable
4
+ include Marc4R::Fields::Datable
5
+ def initialize(tag=nil,data=nil)
6
+ self.tag= tag if tag
7
+ self.data= data if data
8
+ end
9
+ def self.accepts_tag(tag)
10
+ tag =~ /^00[0-9]$/
11
+ end
12
+ def eql? o
13
+ if o.is_a? Marc4R::Fields::ControlField
14
+ (self.tag.eql? o.tag) && (self.data.eql? o.data)
15
+ else
16
+ false
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,46 @@
1
+ class Marc4R::Fields::DataField
2
+ include Marc4R::Fields::Idable
3
+ include Marc4R::Fields::Taggable
4
+ attr_accessor :indicator1, :indicator2
5
+ def initialize(tag=nil, ind1=nil, ind2=nil, *args)
6
+ self.tag= tag if tag
7
+ self.indicator1 = ind1 if ind1
8
+ self.indicator2 = ind2 if ind2
9
+ @subfields = []
10
+ args.each_slice(2) do |slice|
11
+ if (slice[0].size != 1)
12
+ raise Marc4R::MarcException.new("subfield code must be a single character #{slice.inspect}")
13
+ end
14
+ @subfields << Marc4R::Fields::Subfield.new(*slice)
15
+ end
16
+ end
17
+
18
+ def subfields(code=nil)
19
+ code ? @subfields.select {|sf| sf.code == code} : @subfields
20
+ end
21
+
22
+ def subfield(code=nil)
23
+ subfields(code).first
24
+ end
25
+
26
+ def =~ pattern
27
+ subfields.detect {|f| f =~ pattern}
28
+ end
29
+
30
+ def eql? other
31
+ if other.is_a? Marc4R::Fields::DataField
32
+ r = self.tag.eql? other.tag
33
+ r &= self.indicator1.eql? other.indicator1
34
+ r &= self.indicator2.eql? other.indicator2
35
+ r &= self.subfields.size.eql? other.subfields.size
36
+ if r
37
+ self.subfields.each do |sf|
38
+ r &= other.subfields.detect {|osf| (osf.code.eql? sf.code) && (osf.data.eql? sf.data)}
39
+ end
40
+ end
41
+ r
42
+ else
43
+ false
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,12 @@
1
+ class Marc4R::Fields::Subfield
2
+ include Marc4R::Fields::Idable
3
+ include Marc4R::Fields::Datable
4
+ attr_accessor :code
5
+ def initialize(code=nil, data=nil)
6
+ self.code = code if code
7
+ self.data = data if data
8
+ end
9
+ def to_s
10
+ "#{code}#{data}"
11
+ end
12
+ end
@@ -0,0 +1,82 @@
1
+ class Marc4R::MarcStreamReader
2
+ include Enumerable
3
+ def initialize(io, enc=nil)
4
+ @io = io
5
+ @encoding = enc ? Encoding.find(enc) : nil
6
+ end
7
+ def close
8
+ @io.close
9
+ end
10
+ def each
11
+ until @io.eof? do
12
+ leader = @io.read(24)
13
+ record = Marc4R::Record.new(leader)
14
+ record_body = @io.read(record.leader.record_length - 24)
15
+ load_record(record, record_body)
16
+ yield record
17
+ end
18
+ end
19
+ def load_record(record, content)
20
+ leader = record.leader
21
+ dir_length = leader.data_base_address - 25
22
+ raise Marc4R::MarcException.new("invalid directory length #{dir_length}\n#{leader.to_s}\n#{content}") unless (dir_length % 12) == 0
23
+ size = dir_length / 12
24
+
25
+ # if MARC 21 then check encoding
26
+ unless @encoding
27
+ if leader.char_coding_scheme.eql? ' '
28
+ @encoding = Encoding.find("ISO-8859-1")
29
+ elsif leader.char_coding_scheme.eql? 'a'
30
+ @encoding = Encoding.find("UTF-8")
31
+ end
32
+ end
33
+
34
+ tags = []
35
+ lengths = []
36
+ starts = []
37
+ offset = 0
38
+ size.times do
39
+ tags << content.slice(offset,3)
40
+ lengths << content.slice(offset+3,4).to_i
41
+ offset += 12
42
+ end
43
+
44
+ unless content[offset] == Marc4R::Terminators::FIELD_TERMINATOR
45
+ raise Marc4R::MarcException.new("expected field terminator at end of directory")
46
+ else
47
+ offset += 1
48
+ end
49
+
50
+ (0...size).each do |i|
51
+ field_content = content.slice(offset,lengths[i])
52
+ offset += lengths[i]
53
+ unless field_content[-1] == Marc4R::Terminators::FIELD_TERMINATOR
54
+ raise Marc4R::MarcException.new("expected field terminator at end of field #{field_content}")
55
+ end
56
+ if Marc4R::Fields::ControlField.accepts_tag(tags[i])
57
+ data = field_content[0...-1].force_encoding(@encoding)
58
+ record.control_fields << Marc4R::Fields::ControlField.new(tags[i], data)
59
+ else # read a data field
60
+ record.data_fields << data_field(tags[i],field_content[0...-1])
61
+ end
62
+ end
63
+ unless content[offset] == Marc4R::Terminators::RECORD_TERMINATOR
64
+ raise Marc4R::MarcException.new("expected record terminator")
65
+ end
66
+ end
67
+ def data_field(tag, field_content)
68
+ raise Marc4R::MarcException.new("malformed data data field content") if field_content.size < 2
69
+ ind1 = field_content[0]
70
+ ind2 = field_content[1]
71
+
72
+ data_field = Marc4R::Fields::DataField.new(tag, ind1, ind2)
73
+ if field_content[2] == Marc4R::Terminators::SUBFIELD_TERMINATOR
74
+ subfields = field_content[3..-1].split(Marc4R::Terminators::SUBFIELD_TERMINATOR)
75
+ subfields = subfields.collect {|x| [x[0], x.slice(1..-1).force_encoding(@encoding)]}
76
+ subfields.flatten!
77
+ else
78
+ subfields = []
79
+ end
80
+ return Marc4R::Fields::DataField.new(tag, ind1, ind2, *subfields)
81
+ end
82
+ end
@@ -0,0 +1,92 @@
1
+ class Marc4R::Record
2
+
3
+ attr_accessor :leader, :control_fields ,:data_fields
4
+
5
+ def initialize(leader = nil)
6
+ self.leader = Leader.new(leader)
7
+ self.control_fields = []
8
+ self.data_fields = []
9
+ end
10
+
11
+ def control_number
12
+ control_fields('001').first.data
13
+ end
14
+
15
+ def control_number_field
16
+ control_fields('001').first
17
+ end
18
+
19
+ def control_fields(*tags)
20
+ tags.empty? ? @control_fields : @control_fields.select {|field| tags.include? field.tag}
21
+ end
22
+
23
+ def data_fields(*tags)
24
+ tags.empty? ? @data_fields : @data_fields.select {|field| tags.include? field.tag}
25
+ end
26
+
27
+ def find(*args)
28
+
29
+ pattern = (args.last.is_a? Regexp) ? args.pop : nil
30
+ fields = (control_fields(*args) + data_fields(*args))
31
+ if pattern
32
+ fields = fields.select {|x| x =~ pattern}
33
+ end
34
+ fields
35
+ end
36
+
37
+ class Leader
38
+ attr_accessor :id, :record_length, :record_status, :record_type,
39
+ :impl_defined1, :char_coding_scheme, :indicator_count,
40
+ :subfield_code_count, :data_base_address, :impl_defined2, :entry_map
41
+
42
+ def initialize(value = nil)
43
+ parse(value) if value
44
+ end
45
+ def eql? x
46
+ (x.is_a? Marc4R::Record::Leader) && self.to_s.eql?(x.to_s)
47
+ end
48
+ private
49
+ def parse(value)
50
+ raise Marc4R::MarcException.new("leader should be 24 characters, was #{value.size}") unless value.size == 24
51
+ # The logical record length (Position 0-4).
52
+ @record_length = value[0..4].to_i
53
+ # The record status (Position 5).
54
+ @record_status = value[5]
55
+ # Type of record (Position 6).
56
+ @record_type = value[6]
57
+ # Implementation defined (Position 7-8).
58
+ @impl_defined1 = [value[7],value[8]]
59
+ # Character coding scheme (Position 9).
60
+ @char_coding_scheme = value[9]
61
+ # The indicator count (Position 10).
62
+ @indicator_count = value[10].to_i
63
+ # The subfield code length (Position 11).
64
+ @subfield_code_count = value[11].to_i
65
+ # The base address of data (Position 12-16).
66
+ @data_base_address = value[12..16].to_i
67
+ # Implementation defined (Position 17-18).
68
+ @impl_defined2 = [value[17],value[18]]
69
+ # Entry map (Position 19-23).
70
+ @entry_map = (19..23).collect {|x| value[x]}
71
+ end
72
+ def zero_pad(int, min_length)
73
+ log = (int > 0) ? Math.log10(int).ceil : 1
74
+ (log < min_length) ? (0...min_length-log).inject(int.to_s) {|m,v| m.prepend '0'}
75
+ : int.to_s
76
+ end
77
+ public
78
+ def to_s
79
+ strings = @record_length ? [zero_pad(@record_length,5)] : []
80
+ strings << @record_status if @record_status
81
+ strings << @record_type if @record_type
82
+ strings += @impl_defined1 if @impl_defined1
83
+ strings << @char_coding_scheme if @char_coding_scheme
84
+ strings << @indicator_count.to_s if @indicator_count
85
+ strings << @subfield_code_count.to_s if @subfield_code_count
86
+ strings << zero_pad(@data_base_address,5) if @data_base_address
87
+ strings += @impl_defined2 if @impl_defined2
88
+ strings += @entry_map if @entry_map
89
+ strings.join('')
90
+ end
91
+ end
92
+ end
data/marc4r.gemspec ADDED
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ version = File.read(File.expand_path("../VERSION",__FILE__)).strip
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["barmintor"]
6
+ gem.email = ["armintor@gmail.com"]
7
+ gem.description = %q{MARC4R is a Ruby MARC parser based on MARC4J}
8
+ gem.summary = %q{MARC4R is a Ruby MARC parser based on MARC4J}
9
+ gem.homepage = "http://github.com/barmintor/marc4r"
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "marc4r"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = version
17
+ gem.license = 'MIT'
18
+
19
+ gem.add_development_dependency 'rake'
20
+ gem.add_development_dependency 'rspec-its'
21
+ end
@@ -0,0 +1,123 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><collection xmlns="http://www.loc.gov/MARC21/slim">
2
+ <record>
3
+ <leader>02219cam a2200385Ia 4500</leader>
4
+ <controlfield tag="001">ocn814388508</controlfield>
5
+ <controlfield tag="003">OCoLC</controlfield>
6
+ <controlfield tag="005">20140115103422.0</controlfield>
7
+ <controlfield tag="008">121025s2011 gr ab b 100 0 gre d</controlfield>
8
+ <datafield tag="040" ind1=" " ind2=" ">
9
+ <subfield code="a">JPG</subfield>
10
+ <subfield code="c">JPG</subfield>
11
+ <subfield code="d">JPG</subfield>
12
+ </datafield>
13
+ <datafield tag="066" ind1=" " ind2=" ">
14
+ <subfield code="c">(S</subfield>
15
+ </datafield>
16
+ <datafield tag="020" ind1=" " ind2=" ">
17
+ <subfield code="a">9789608838765</subfield>
18
+ </datafield>
19
+ <datafield tag="020" ind1=" " ind2=" ">
20
+ <subfield code="a">9608838762</subfield>
21
+ </datafield>
22
+ <datafield tag="035" ind1=" " ind2=" ">
23
+ <subfield code="a">(OCoLC)814388508</subfield>
24
+ </datafield>
25
+ <datafield tag="041" ind1="0" ind2=" ">
26
+ <subfield code="a">gre</subfield>
27
+ <subfield code="a">eng</subfield>
28
+ <subfield code="a">ger</subfield>
29
+ <subfield code="b">eng</subfield>
30
+ <subfield code="b">gre</subfield>
31
+ </datafield>
32
+ <datafield tag="043" ind1=" " ind2=" ">
33
+ <subfield code="a">mm-----</subfield>
34
+ </datafield>
35
+ <datafield tag="050" ind1=" " ind2="4">
36
+ <subfield code="a">NA9070</subfield>
37
+ <subfield code="b">.A36 2011</subfield>
38
+ </datafield>
39
+ <datafield tag="049" ind1=" " ind2=" ">
40
+ <subfield code="a">VA@@</subfield>
41
+ </datafield>
42
+ <datafield tag="245" ind1="0" ind2="3">
43
+ <subfield code="6">880-01</subfield>
44
+ <subfield code="a">Hē agora stē Mesogeio :</subfield>
45
+ <subfield code="b">apo tous Homērikous heōs tous Rōmaikous chronous : Diethnes epistēmoniko synedrio, Kōs, 14-17 Apriliou 2011 = The agora in the Mediterranean : from Homeric to Roman times : International conference, Kos, 14-17 April 2011 /</subfield>
46
+ <subfield code="c">epistēmonikē epimeleia, Angelikē Giannikourē.</subfield>
47
+ </datafield>
48
+ <datafield tag="246" ind1="3" ind2="1">
49
+ <subfield code="a">Agora in the Mediterranean</subfield>
50
+ </datafield>
51
+ <datafield tag="260" ind1=" " ind2=" ">
52
+ <subfield code="6">880-02</subfield>
53
+ <subfield code="a">Athēna :</subfield>
54
+ <subfield code="b">Hypourgeio Politismou kai Tourismou, Archaiologiko Instituto Aigaiakōn Spoudōn,</subfield>
55
+ <subfield code="c">2011.</subfield>
56
+ </datafield>
57
+ <datafield tag="300" ind1=" " ind2=" ">
58
+ <subfield code="a">438 p. :</subfield>
59
+ <subfield code="b">ill., maps ;</subfield>
60
+ <subfield code="c">28 cm.</subfield>
61
+ </datafield>
62
+ <datafield tag="504" ind1=" " ind2=" ">
63
+ <subfield code="a">Includes bibliographical references.</subfield>
64
+ </datafield>
65
+ <datafield tag="546" ind1=" " ind2=" ">
66
+ <subfield code="a">Contributions in Greek or English, with abstracts in the other language; 1 contribution in German, with abstract in Greek.</subfield>
67
+ </datafield>
68
+ <datafield tag="650" ind1=" " ind2="0">
69
+ <subfield code="a">Plazas</subfield>
70
+ <subfield code="z">Mediterranean Region</subfield>
71
+ <subfield code="v">Congresses.</subfield>
72
+ </datafield>
73
+ <datafield tag="650" ind1=" " ind2="0">
74
+ <subfield code="a">Cities and towns, Ancient</subfield>
75
+ <subfield code="z">Mediterranean Region</subfield>
76
+ <subfield code="v">Congresses.</subfield>
77
+ </datafield>
78
+ <datafield tag="650" ind1=" " ind2="0">
79
+ <subfield code="a">Excavations (Archaeology)</subfield>
80
+ <subfield code="z">Mediterranean Region</subfield>
81
+ <subfield code="v">Congresses.</subfield>
82
+ </datafield>
83
+ <datafield tag="651" ind1=" " ind2="0">
84
+ <subfield code="a">Mediterranean Region</subfield>
85
+ <subfield code="x">Antiquities</subfield>
86
+ <subfield code="v">Congresses.</subfield>
87
+ </datafield>
88
+ <datafield tag="700" ind1="1" ind2=" ">
89
+ <subfield code="6">880-03</subfield>
90
+ <subfield code="a">Giannikourē, A.</subfield>
91
+ </datafield>
92
+ <datafield tag="710" ind1="1" ind2=" ">
93
+ <subfield code="6">880-04</subfield>
94
+ <subfield code="a">Greece.</subfield>
95
+ <subfield code="b">Archaiologiko Institouto Aigaiakōn Spoudōn.</subfield>
96
+ </datafield>
97
+ <datafield tag="880" ind1="0" ind2="2">
98
+ <subfield code="6">245-01/(S</subfield>
99
+ <subfield code="a">Η αγορά στη Μεσόγειο :</subfield>
100
+ <subfield code="b">από τους Ομηρικούς έως τους Ρωμαϊκούς χρόνους : Διεθνές επιστημονικό συνέδριο, Κως, 14-17 Απριλίου 2011 = The agora in the Mediterranean : from Homeric to Roman times : International conference, Kos, 14-17 April 2011 /</subfield>
101
+ <subfield code="c">επιστημονικη επιμέλεια Αγγελική Γιαννικουρη.</subfield>
102
+ </datafield>
103
+ <datafield tag="880" ind1=" " ind2=" ">
104
+ <subfield code="6">260-02/(S</subfield>
105
+ <subfield code="a">Αθηνα :</subfield>
106
+ <subfield code="b">Υπουργείο Πολιτισμου και Τουρισμου, Αρχαιολογικου Ινστιτουτου Αιγαιακών Σπουδών,</subfield>
107
+ <subfield code="c">2011.</subfield>
108
+ </datafield>
109
+ <datafield tag="880" ind1="1" ind2=" ">
110
+ <subfield code="6">700-03/(S</subfield>
111
+ <subfield code="a">Γιαννικουρη, Α.</subfield>
112
+ </datafield>
113
+ <datafield tag="880" ind1="1" ind2=" ">
114
+ <subfield code="6">710-04/(S</subfield>
115
+ <subfield code="a">Greece.</subfield>
116
+ <subfield code="b">Αρχαιολογικου Ινστιτουτου Αιγαιακών Σπουδών.</subfield>
117
+ </datafield>
118
+ <datafield tag="994" ind1=" " ind2=" ">
119
+ <subfield code="a">C0</subfield>
120
+ <subfield code="b">VA@</subfield>
121
+ </datafield>
122
+ </record>
123
+ </collection>