fix for subfield ID length in MAB, fix for UNIMARC

This commit is contained in:
Jörg Prante 2017-10-17 15:59:03 +02:00
parent ae5b85f923
commit 3fb01e1b2c
21 changed files with 722524 additions and 164 deletions

View file

@ -1,6 +1,6 @@
group = org.xbib
name = marc
version = 1.0.14
version = 1.0.15
xbib-content.version = 1.0.7
xbib-bibliographic-character-sets.version = 1.0.0

View file

@ -270,8 +270,16 @@ public final class Marc {
wrapIntoCollection(new BufferedSeparatorInputStream(builder.getInputStream()));
}
public void writeCollection(String type) throws IOException {
wrapIntoCollection(type, new BufferedSeparatorInputStream(builder.getInputStream()));
}
public int wrapIntoCollection(ChunkStream<byte[], BytesReference> stream) throws IOException {
return wrapFields(stream, true);
return wrapFields(BIBLIOGRAPHIC_TYPE, stream, true);
}
public int wrapIntoCollection(String type, ChunkStream<byte[], BytesReference> stream) throws IOException {
return wrapFields(type, stream, true);
}
/**
@ -282,10 +290,10 @@ public final class Marc {
* @return the number of chunks in the stream
* @throws IOException if chunk reading fails
*/
public int wrapFields(ChunkStream<byte[], BytesReference> stream,
public int wrapFields(String type, ChunkStream<byte[], BytesReference> stream,
boolean withCollection) throws IOException {
int count = 0;
MarcListener marcListener = builder.getMarcListener();
MarcListener marcListener = builder.getMarcListener(type);
if (marcListener == null) {
return count;
}
@ -705,6 +713,10 @@ public final class Marc {
return listeners.get(BIBLIOGRAPHIC_TYPE);
}
public MarcListener getMarcListener(String type) {
return listeners.get(type);
}
public Map<String, MarcListener> getMarcListeners() {
return listeners;
}

View file

@ -16,6 +16,7 @@
*/
package org.xbib.marc;
import org.xbib.marc.dialects.mab.MabSubfieldControl;
import org.xbib.marc.label.RecordLabel;
import java.util.LinkedList;
@ -33,6 +34,8 @@ public class MarcField implements Comparable<MarcField> {
private static final String EMPTY_STRING = "";
private static final String BLANK_STRING = " ";
private final String tag;
private final String indicator;
@ -318,6 +321,8 @@ public class MarcField implements Comparable<MarcField> {
private LinkedList<String> subfieldIds;
private Boolean isControl;
Builder() {
this.subfields = new LinkedList<>();
this.subfieldIds = new SubfieldIds();
@ -349,8 +354,10 @@ public class MarcField implements Comparable<MarcField> {
* @return this builder
*/
public Builder indicator(String indicator) {
// check if indicators are "-" (like Aleph does). Replace with blank.
this.indicator = indicator != null ? indicator.replace('-', ' ') : null;
if (indicator != null) {
// check if indicators are visible replacements like "-" or "#" . Replace with blank.
this.indicator = indicator.replace('-', ' ').replace('#', ' ');
}
return this;
}
@ -399,7 +406,7 @@ public class MarcField implements Comparable<MarcField> {
}
/**
* Set (non-subfield) value.
* Set value for control/data field.
* @param value the value
* @return this builder
*/
@ -409,13 +416,13 @@ public class MarcField implements Comparable<MarcField> {
}
/**
* Set subfield with ID and value.
* Set subfield with subfield ID and value.
* @param subfieldId the subfield ID
* @param value the subfield value
* @return this builder
*/
public Builder subfield(String subfieldId, String value) {
this.subfields.add(new Subfield(subfieldId, value));
subfields.add(new Subfield(subfieldId, value));
subfieldIds.add(subfieldId);
return this;
}
@ -426,8 +433,7 @@ public class MarcField implements Comparable<MarcField> {
* @return this builder
*/
public Builder subfield(String subfieldId) {
this.subfields.add(new Subfield(subfieldId, null));
subfieldIds.add(subfieldId);
subfield(subfieldId, null);
return this;
}
@ -454,75 +460,77 @@ public class MarcField implements Comparable<MarcField> {
}
/**
* Set subfield value to the last subfield which was denoted by a subfield ID.
* Set subfield value in the last subfield which was added.
* @param value the subfield value
* @return this builder
*/
public Builder subfieldValue(String value) {
Subfield subfield = this.subfields.removeLast();
this.subfields.add(new Subfield(subfield.getId(), value));
subfields.add(new Subfield(subfields.removeLast().getId(), value));
return this;
}
/**
* Set subfield with help of record label information from raw data.
* @param label the record label
* @param raw the subfield, including ID and separator
* @return this builder
*/
public Builder subfield(RecordLabel label, String raw) {
// subtract 1 because subfield identifier length includes US separator character
int subfieldidlen = label.getSubfieldIdentifierLength() - 1;
if (subfieldidlen > 0 && raw.length() >= subfieldidlen) {
String subfieldId = raw.substring(0, subfieldidlen);
subfields.add(new Subfield(subfieldId, raw.substring(subfieldidlen)));
subfieldIds.add(subfieldId);
}
return this;
}
/**
* Set synthetic subfield with help of record label information from raw data.
* If the len of the subfield ID is zero or undefined, the dummy subfield ID is used.
* @param label the record label
* @param dummySubfieldId the dummy subfield ID
* @param value the subfield value
* @return this builder
*/
public Builder subfield(RecordLabel label, String dummySubfieldId, String value) {
int len = label.getSubfieldIdentifierLength() - 1;
if (len <= 0) {
subfields.add(new Subfield(dummySubfieldId, value));
subfieldIds.add(dummySubfieldId);
} else if (value.length() >= len) {
public Builder value(RecordLabel recordLabel, String value) {
if (value.length() > 0) {
int len = recordLabel.getSubfieldIdentifierLength() - 1; /* minus length of US separator char */
boolean createSubfields = len > 0 && value.length() > len;
if (createSubfields) {
String id = value.substring(0, len);
subfields.add(new Subfield(id, value.substring(len)));
subfieldIds.add(id);
String content = value.substring(len);
subfield(id, content);
} else {
value(value);
}
}
return this;
}
public Builder value(String format, String type, RecordLabel recordLabel, String value) {
if (value.length() > 0) {
int len = recordLabel.getSubfieldIdentifierLength() - 1; /* minus length of US separator char */
// override in case of MAB, which contains a wild mixture of subfield ID lengths
if ("MAB".equals(format) && "Titel".equals(type)) {
len = MabSubfieldControl.getSubfieldIdLen(tag());
}
boolean canDeriveSubfieldId = len > 0 && value.length() > len;
if (canDeriveSubfieldId) {
String id = value.substring(0, len);
String content = value.substring(len);
subfield(id, content);
} else {
subfield(BLANK_STRING, value);
}
}
return this;
}
/**
* Set a new data field with help of a record label from raw data.
* @param label the record label
* @param raw raw data
* Set a new field with help of a record label from raw data.
* @param format the record format
* @param type the record type
* @param recordLabel the record label
* @param raw raw data (tag plus indicator plus value)
* @return this builder
*/
public Builder field(RecordLabel label, String raw) {
this.tag = raw.length() > 2 ? raw.substring(0, 3) : null;
public Builder field(String format, String type, RecordLabel recordLabel, String raw) {
if (raw.length() >= 3) {
tag(raw.substring(0, 3));
}
if (isControl()) {
if (raw.length() > 3) {
value(raw.substring(3));
}
} else {
int pos = 3 + label.getIndicatorLength();
this.indicator = raw.length() >= pos ? raw.substring(3, pos) : null;
int subfieldidlen = label.getSubfieldIdentifierLength();
int pos = 3 + recordLabel.getIndicatorLength();
if (raw.length() >= pos) {
indicator(raw.substring(3, pos));
value(format, type, recordLabel, raw.substring(pos));
}
/*int subfieldidlen = label.getSubfieldIdentifierLength();
if (raw.length() >= pos + subfieldidlen) {
String subfieldId = raw.substring(pos, pos + subfieldidlen);
this.subfields.add(new Subfield(subfieldId, raw.substring(pos + subfieldidlen)));
subfieldIds.add(subfieldId);
}
}*/
}
return this;
}
@ -545,12 +553,20 @@ public class MarcField implements Comparable<MarcField> {
return this;
}
public Builder setControl(boolean isControl) {
this.isControl = isControl;
return this;
}
/**
* Is the MARC field a control field?
* @return true if control field, false if not
*/
public boolean isControl() {
return tag != null && tag.charAt(0) == '0' && tag.charAt(1) == '0';
if (isControl == null) {
this.isControl = tag != null && tag.charAt(0) == '0' && tag.charAt(1) == '0';
}
return isControl;
}
/**
@ -574,8 +590,11 @@ public class MarcField implements Comparable<MarcField> {
* @return the built MARC field.
*/
public MarcField build() {
if (isControl == null) {
this.isControl = tag != null && tag.charAt(0) == '0' && tag.charAt(1) == '0';
}
return new MarcField(tag, indicator, position, length,
value, subfields, subfieldIds.toString(), isControl());
value, subfields, subfieldIds.toString(), isControl);
}
@Override

View file

@ -40,8 +40,6 @@ import java.util.List;
*/
public class MarcGenerator implements ChunkListener<byte[], BytesReference>, Closeable {
private static final String EMPTY = " ";
private String format;
private String type;
@ -153,22 +151,19 @@ public class MarcGenerator implements ChunkListener<byte[], BytesReference>, Clo
emitMarcField();
if (directory == null || directory.isEmpty()) {
if (marcTransformer != null) {
marcTransformer.transform(builder, recordLabel, this.data);
marcTransformer.transform(builder, recordLabel, data);
} else {
builder.field(recordLabel, this.data);
builder.field(format, type, recordLabel, data);
}
} else if (directory.containsKey(position)) {
builder = directory.get(position);
if (builder.isControl()) {
builder.value(this.data);
builder.value(data);
} else {
// we may have fields which are broken when data is longer
// than indicator length. Then, a subfield delimiter/ID
// is missing, and we insert a blank subfield ID plus the data here.
int pos = recordLabel.getIndicatorLength();
builder.indicator(this.data.substring(0, pos));
if (pos < this.data.length()) {
builder.subfield(recordLabel, EMPTY, this.data.substring(pos));
builder.indicator(data.substring(0, pos));
if (pos < data.length()) {
builder.value(data.substring(pos));
}
}
} else {
@ -179,19 +174,26 @@ public class MarcGenerator implements ChunkListener<byte[], BytesReference>, Clo
position = position + offset;
builder = directory.get(position);
if (builder.isControl()) {
builder.value(this.data);
builder.value(data);
} else {
builder.indicator(this.data);
}
int pos = recordLabel.getIndicatorLength();
builder.indicator(data.substring(0, pos));
if (pos < data.length()) {
builder.value(this.data.substring(pos));
} }
found = true;
break;
} else if (directory.containsKey(position - offset)) {
position = position - offset;
builder = directory.get(position);
if (builder.isControl()) {
builder.value(this.data);
builder.value(data);
} else {
builder.indicator(this.data);
int pos = recordLabel.getIndicatorLength();
builder.indicator(data.substring(0, pos));
if (pos < data.length()) {
builder.value(data.substring(pos));
}
}
found = true;
break;
@ -204,8 +206,8 @@ public class MarcGenerator implements ChunkListener<byte[], BytesReference>, Clo
}
break;
}
case US: /* 1f */{
builder.subfield(recordLabel, EMPTY, this.data);
case US: /* 1f */ {
builder.value(recordLabel, data);
break;
}
default: {
@ -258,10 +260,10 @@ public class MarcGenerator implements ChunkListener<byte[], BytesReference>, Clo
private void newRecord() throws IOException {
// skip line-feed (OCLC PICA quirk)
if (this.data.charAt(0) == '\n') {
this.data = data.substring(1);
if (data.charAt(0) == '\n') {
data = data.substring(1);
}
if (this.data.length() > RecordLabel.LENGTH) {
if (data.length() > RecordLabel.LENGTH) {
// record label + record content = old directory-based format
this.recordLabel = RecordLabel.builder().from(this.data.substring(0, RecordLabel.LENGTH).toCharArray()).build();
if (recordLabelFixer != null) {
@ -274,7 +276,7 @@ public class MarcGenerator implements ChunkListener<byte[], BytesReference>, Clo
// create directory
this.directory = new MarcFieldDirectory(recordLabel, this.data);
if (directory.isEmpty()) {
builder.field(recordLabel, this.data.substring(RecordLabel.LENGTH));
builder.field(format, type, recordLabel, data.substring(RecordLabel.LENGTH));
}
} else if (this.data.length() == RecordLabel.LENGTH) {
this.recordLabel = RecordLabel.builder().from(this.data.substring(0, RecordLabel.LENGTH).toCharArray()).build();

View file

@ -0,0 +1,22 @@
package org.xbib.marc.dialects.mab;
import java.util.HashMap;
import java.util.Map;
/**
*
*/
public class MabSubfieldControl {
private static final Map<String, Integer> FIELDS = new HashMap<>();
static {
// MARC-like fields with subfield structure
FIELDS.put("088", 2);
FIELDS.put("655", 2);
FIELDS.put("856", 2);
}
public static Integer getSubfieldIdLen(String tag) {
return FIELDS.getOrDefault(tag, 0);
}
}

View file

@ -83,7 +83,7 @@ public class SisisInputStream extends PatternInputStream {
this.marcGenerator = marcGenerator;
this.bytesStreamOutput = new BytesStreamOutput();
// this format comes without a record label, create a default one
this.label = RecordLabel.builder().setIndicatorLength(2).setSubfieldIdentifierLength(1).build();
this.label = RecordLabel.builder().setIndicatorLength(2).setSubfieldIdentifierLength(2).build();
this.labelEmitted = false;
}

View file

@ -16,6 +16,11 @@
*/
package org.xbib.marc;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import org.xbib.marc.io.ReplaceStringInputStream;
import org.xbib.marc.transformer.value.MarcValueTransformers;
@ -32,11 +37,6 @@ import java.text.Normalizer;
import java.util.List;
import java.util.stream.Collectors;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
/**
*
*/

View file

@ -1,14 +1,14 @@
package org.xbib.marc;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.concurrent.atomic.AtomicInteger;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
*
*/

View file

@ -0,0 +1,63 @@
package org.xbib.marc.dialects.mab;
import org.junit.Test;
import org.xbib.marc.Marc;
import org.xbib.marc.MarcRecord;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Logger;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
*
*/
public class HBZTest {
private static final Logger logger = Logger.getLogger(HBZTest.class.getName());
@Test
public void testMarcStream() throws Exception {
String[] files = {
"HBZ.mab"
};
for (String file : files) {
AtomicInteger count = new AtomicInteger();
try (InputStream in = getClass().getResource(file).openStream()) {
Marc marc = Marc.builder()
.setInputStream(in)
.setCharset(Charset.forName("UTF-8"))
.build();
marc.iso2709Stream().chunks().forEach(chunk -> {
count.incrementAndGet();
});
}
assertTrue(count.get() > 0);
}
}
@Test
public void testMarcRecordIterable() throws Exception {
String[] files = {
"HBZ.mab"
};
for (String file : files) {
int count = 0;
try (InputStream in = getClass().getResource(file).openStream()) {
Marc.Builder builder = Marc.builder()
.setFormat("MAB")
.setType("Titel")
.setInputStream(in)
.setCharset(Charset.forName("x-MAB"));
for (MarcRecord marcRecord : builder.iterable()) {
count++;
logger.info("record = " + marcRecord);
}
}
assertEquals(1, count);
}
}
}

View file

@ -63,19 +63,18 @@ public class MabTest {
File file = File.createTempFile(s + ".", ".xml");
file.deleteOnExit();
FileOutputStream out = new FileOutputStream(file);
try (MarcXchangeWriter writer = new MarcXchangeWriter(out)
try (MarcXchangeWriter writer = new MarcXchangeWriter(out, true)
.setFormat("MAB")
.setType("Bibliographic")) {
.setType("Titel")
) {
Marc.builder()
.setFormat("MAB")
.setType("Titel")
.setInputStream(in)
.setCharset(Charset.forName("x-MAB"))
.setFormat("MAB")
.setType("Bibliographic")
.setRecordLabelFixer(recordLabel ->
RecordLabel.builder().from(recordLabel).setSubfieldIdentifierLength(0).build())
.setMarcListener(writer)
.setMarcListener("Titel", writer)
.build()
.writeCollection();
.writeCollection("Titel");
}
assertThat(file, CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream()));
}

View file

@ -1,5 +1,8 @@
package org.xbib.marc.dialects.mab;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import org.xbib.marc.Marc;
import org.xbib.marc.MarcRecord;
@ -9,9 +12,6 @@ import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.concurrent.atomic.AtomicInteger;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
*
*/

View file

@ -29,6 +29,7 @@ import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.StringWriter;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
/**
@ -45,8 +46,8 @@ public class SisisTest extends Assert {
public void testSisis() throws Exception {
String s = "unloaddipl";
InputStream in = getClass().getResource(s).openStream();
StringWriter sw = new StringWriter();
try (MarcXchangeWriter writer = new MarcXchangeWriter(sw)
Writer out = new StringWriter();
try (MarcXchangeWriter writer = new MarcXchangeWriter(out)
.setFormat(MarcXchangeConstants.MARCXCHANGE_FORMAT)) {
Marc marc = Marc.builder()
.setInputStream(in)
@ -56,7 +57,7 @@ public class SisisTest extends Assert {
long l = marc.wrapIntoCollection(marc.sisis());
assertEquals(36353, l);
}
assertThat(sw.toString(), CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream()));
assertThat(out.toString(), CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream()));
}
/**

View file

@ -46,7 +46,7 @@ public class UnimarcTest extends Assert {
File file = File.createTempFile("periouni.", ".xml");
file.deleteOnExit();
FileOutputStream out = new FileOutputStream(file);
try (MarcXchangeWriter writer = new MarcXchangeWriter(out)
try (MarcXchangeWriter writer = new MarcXchangeWriter(out, true)
.setFormat("UNIMARC")
.setType("Bibliographic")) {
Marc.builder()

View file

@ -2,6 +2,7 @@ package org.xbib.marc.filter;
import org.junit.Test;
import org.xbib.content.XContentBuilder;
import org.xbib.content.json.JsonXContent;
import org.xbib.marc.Marc;
import org.xbib.marc.MarcField;
import org.xbib.marc.MarcFieldAdapter;
@ -18,8 +19,6 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import static org.xbib.content.json.JsonXContent.contentBuilder;
/**
* Demo of collecting ISSNs by record identifier from a MARC file.
*
@ -79,7 +78,7 @@ public class MarcFieldFilterByRecordIdentifierTest {
.collect(Collectors.toList());
// JSON output
XContentBuilder builder = contentBuilder().prettyPrint()
XContentBuilder builder = JsonXContent.contentBuilder().prettyPrint()
.startObject();
for (Map.Entry<String, Map<String, List<Map<String, String>>>> entry : result.entrySet()) {
builder.field(entry.getKey(), entry.getValue());

View file

@ -4,13 +4,13 @@
<leader>01794 0000445 000 </leader>
<controlfield tag="001">000800000020003000008020004200038035001200080005001700092008008100109010001700190016002200207029002200229035001200251035001600263040001800279042000800297043003000305049000900335050002200344072001200366110004800378245024900426246002200675260008500697300004100782504005100823650004300874650004300917650004300960650004301003650004101046610005901087700002001146700002501166938005301191994001201244910002601256991006601282</controlfield>
<datafield ind2=" " ind1=" " tag="260">
<subfield code="a">0772</subfield>
<subfield code=" ">0772</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="200">
<subfield code="a">90311033800.0</subfield>
<subfield code=" ">90311033800.0</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="051">
<subfield code="a">028s 01609cam 22004094a 4500 </subfield>
<subfield code=" ">028s 01609cam 22004094a 4500 </subfield>
</datafield>
</record>
</collection>

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
01268nM2.01200024 h001 HT018546928002a20150219003 20150427004 20171017025a1059839261026 DNB1059839261030 a|1uc||||||17036aCN037beng050 a|||||||||||||051 m|||||||070 468070b832080 60088 a1044b00000001c11 = TWD1002eILL Ausleihe088 a832b00002000cTWD2900eILL Ausleihe088 a461/1b205cTWX/GOReKeine Angabe088 a361b00000010cHK365=E370 G671eILL Kopie+Ausl.088 a294b00000031cWWB53734eILL Ausleihe088 a708b00cTYP/GOReNormalausleihe088 a465bE31cTWY9750+1eAusleihbestand088 a465bE31cTWY9750eAusleihbestand088 a468b69cTWX1228eausleihbar100 Gormley, Clinton102a(DE-588)1067675272104aTong, Zachary106a(DE-588)1067675701331 Elasticsearch335 the definitive guide ; [a distributed real-time search and analytics engine]359 Clinton Gormley and Zachary Tong403 1. ed.410 Beijing [u.a.]412 O'Reilly425a2015433 XXX, 690 S. : Ill., graph. Darst.540aISBN 978-1-4493-5854-9 Pb. : EUR 41.00 (DE) (freier Pr.), EUR 42.20 (AT) (freier Pr.)540aISBN 1-4493-5854-3655emX:MVBqtext/htmluhttp://deposit.d-nb.de/cgi-bin/dokserv?id=4806461&prov=M&dok_var=1&dok_ext=htm3InhaltstextA2655euhttp://digitool.hbz-nrw.de:1801/webclient/DeliveryManager?pid=7240745&custom_att_2=simple_vieweryElasticsearchxInhaltsverzeichnis

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<collection xmlns="info:lc/xmlns/marcxchange-v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="info:lc/xmlns/marcxchange-v2 http://www.loc.gov/standards/iso25577/marcxchange-2-0.xsd">
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">02.09.2014</subfield>
</datafield>
@ -97,7 +97,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">02.09.2014</subfield>
</datafield>
@ -154,7 +154,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">02.09.2014</subfield>
</datafield>
@ -223,7 +223,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">02.09.2014</subfield>
</datafield>
@ -280,7 +280,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">02.09.2014</subfield>
</datafield>
@ -358,7 +358,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">05.09.2014</subfield>
</datafield>
@ -469,7 +469,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">05.09.2014</subfield>
</datafield>
@ -580,7 +580,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">05.09.2014</subfield>
</datafield>
@ -637,7 +637,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">05.09.2014</subfield>
</datafield>
@ -718,7 +718,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">05.09.2014</subfield>
</datafield>
@ -784,7 +784,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">05.09.2014</subfield>
</datafield>
@ -838,7 +838,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">05.09.2014</subfield>
</datafield>
@ -904,7 +904,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">05.09.2014</subfield>
</datafield>
@ -970,7 +970,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">05.09.2014</subfield>
</datafield>
@ -1039,7 +1039,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">05.09.2014</subfield>
</datafield>
@ -1111,7 +1111,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">05.09.2014</subfield>
</datafield>
@ -1189,7 +1189,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">05.09.2014</subfield>
</datafield>
@ -1258,7 +1258,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">05.09.2014</subfield>
</datafield>
@ -1351,7 +1351,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">05.09.2014</subfield>
</datafield>
@ -1420,7 +1420,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">05.09.2014</subfield>
</datafield>
@ -1492,7 +1492,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">05.09.2014</subfield>
</datafield>
@ -1552,7 +1552,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">05.09.2014</subfield>
</datafield>
@ -1630,7 +1630,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">05.09.2014</subfield>
</datafield>
@ -1714,7 +1714,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">05.09.2014</subfield>
</datafield>
@ -1780,7 +1780,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">05.09.2014</subfield>
</datafield>
@ -1852,7 +1852,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">31.08.2014</subfield>
</datafield>
@ -1909,7 +1909,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">31.08.2014</subfield>
</datafield>
@ -1969,7 +1969,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">31.08.2014</subfield>
</datafield>
@ -2041,7 +2041,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">31.08.2014</subfield>
</datafield>
@ -2128,7 +2128,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">31.08.2014</subfield>
</datafield>
@ -2209,7 +2209,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">31.08.2014</subfield>
</datafield>
@ -2290,7 +2290,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">31.08.2014</subfield>
</datafield>
@ -2344,7 +2344,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">01.09.2014</subfield>
</datafield>
@ -2416,7 +2416,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">01.09.2014</subfield>
</datafield>
@ -2500,7 +2500,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">01.09.2014</subfield>
</datafield>
@ -2566,7 +2566,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">01.09.2014</subfield>
</datafield>
@ -2635,7 +2635,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">01.09.2014</subfield>
</datafield>
@ -2713,7 +2713,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">01.09.2014</subfield>
</datafield>
@ -2791,7 +2791,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">01.09.2014</subfield>
</datafield>
@ -2872,7 +2872,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">01.09.2014</subfield>
</datafield>
@ -2938,7 +2938,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">01.09.2014</subfield>
</datafield>
@ -3028,7 +3028,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">01.09.2014</subfield>
</datafield>
@ -3106,7 +3106,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">01.09.2014</subfield>
</datafield>
@ -3169,7 +3169,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">01.09.2014</subfield>
</datafield>
@ -3262,7 +3262,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">01.09.2014</subfield>
</datafield>
@ -3337,7 +3337,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">01.09.2014</subfield>
</datafield>
@ -3412,7 +3412,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">01.09.2014</subfield>
</datafield>
@ -3478,7 +3478,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">01.09.2014</subfield>
</datafield>
@ -3547,7 +3547,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">01.09.2014</subfield>
</datafield>
@ -3655,7 +3655,7 @@
</datafield>
</record>
<record format="MarcXchange" type="Bibliographic">
<leader>00000 2100000 000 </leader>
<leader>00000 2200000 000 </leader>
<datafield tag="903" ind1="9" ind2="1">
<subfield code="a">01.09.2014</subfield>
</datafield>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -24,8 +24,8 @@
<subfield code="c">Michael Chabon.</subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="250">
<subfield code=" "></subfield>
<subfield code="a">1st ed.</subfield>
<subfield code="a"> </subfield>
</datafield>
<datafield ind2=" " ind1=" " tag="260">
<subfield code="a">New York :</subfield>