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.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/Gemfile +4 -0
- data/README.md +4 -0
- data/Rakefile +13 -0
- data/VERSION +1 -0
- data/lib/marc4r.rb +24 -0
- data/lib/marc4r/fields.rb +28 -0
- data/lib/marc4r/fields/control_field.rb +19 -0
- data/lib/marc4r/fields/data_field.rb +46 -0
- data/lib/marc4r/fields/subfield.rb +12 -0
- data/lib/marc4r/marc_stream_reader.rb +82 -0
- data/lib/marc4r/record.rb +92 -0
- data/marc4r.gemspec +21 -0
- data/spec/fixtures/OCLC_814388508.xml +123 -0
- data/spec/fixtures/bad_leaders_10_11.mrc +1 -0
- data/spec/fixtures/bad_too_long_plus_2.mrc +1 -0
- data/spec/fixtures/brkrtest.mrc +1 -0
- data/spec/fixtures/chabon.mrc +1 -0
- data/spec/fixtures/chabon.xml +116 -0
- data/spec/fixtures/chinese_mangled_multibyte.mrc +1 -0
- data/spec/fixtures/cruel-cruel-indicatorless-summerland.xml +55 -0
- data/spec/fixtures/cyrillic_capital_e.mrc +1 -0
- data/spec/fixtures/greekmissingcharsetchange.mrc +1 -0
- data/spec/fixtures/illegal-marc-in-json.json +401 -0
- data/spec/fixtures/legal-json-marc-in-json.json +380 -0
- data/spec/fixtures/loongboonmee.mrc +1 -0
- data/spec/fixtures/marc-in-json.json +380 -0
- data/spec/fixtures/marc-json.json +195 -0
- data/spec/fixtures/summerland-indented-marc-json.json +104 -0
- data/spec/fixtures/summerland-marc-in-json-indented.json +183 -0
- data/spec/fixtures/summerland-marc-in-json.json +1 -0
- data/spec/fixtures/summerland-marc-json.json +1 -0
- data/spec/fixtures/summerland.mrc +1 -0
- data/spec/fixtures/summerland.xml +52 -0
- data/spec/fixtures/u335.mrc +1 -0
- data/spec/lib/marc4r/fields/control_field_spec.rb +46 -0
- data/spec/lib/marc4r/fields/data_field_spec.rb +39 -0
- data/spec/lib/marc4r/marc_stream_reader.rb +19 -0
- data/spec/lib/marc4r/record_spec.rb +111 -0
- data/spec/spec_helper.rb +120 -0
- data/spec/test_constants.rb +22 -0
- data/tasks/marc4r-dev.rake +3 -0
- 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
data/README.md
ADDED
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>
|