marc4r 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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>