marc4r 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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>
|