├── .travis.yml ├── LICENSE.md ├── Makefile ├── README.md ├── doc ├── model.png └── model.xml ├── input ├── .gitignore └── README.md ├── merged └── .gitignore ├── output ├── .gitignore └── README.md ├── refdata ├── .gitignore ├── README.md ├── fennica-collection.ttl └── fennica-dates.csv.gz ├── scripts ├── create-merge-transformations.py ├── create-urn-url-mappings.py ├── extract-subst-260c.py ├── filter-bad-ntriples.py ├── filter-duplicates.py ├── filter-fennica-repl.py ├── filter-marc.fix ├── preprocess-marc.fix ├── rewrite-uris.py ├── split-input.sh ├── strip-personal-info.fix ├── substitute-marc.fix └── update-slices.sh ├── slices ├── .gitignore └── README.md ├── sparql ├── bf-to-schema.rq ├── consolidate-works.rq ├── create-agent-keys.rq ├── create-work-keys.rq ├── extract-cn-labels.rq ├── extract-iso639-1-2-mapping.rq ├── extract-iso639-2-fi.rq ├── merge.rq └── reconcile.rq ├── split-input ├── .gitignore └── README.md └── test ├── 00_refdata.bats ├── 00_slice.bats ├── 05_preprocess.bats ├── 10_marc_dist.bats ├── 15_mrcx.bats ├── 20_bibframe.bats ├── 25_rewrite.bats ├── 30_work_keys.bats ├── 35_work_transformations.bats ├── 40_schema.bats ├── 45_reconcile.bats ├── 50_agent_keys.bats ├── 55_agent_transformations.bats ├── 60_merge.bats ├── 70_consolidate.bats ├── Makefile ├── input ├── abckiria.alephseq ├── aikuiskasvatus.alephseq ├── ajanlyhythistoria.alephseq ├── ajanvirrassa.alephseq ├── ajattelemisenalku.alephseq ├── bad-issn.alephseq ├── bad-url.alephseq ├── ekumeeninen.alephseq ├── etyk.alephseq ├── evaluation.alephseq ├── fanrik-manninen.alephseq ├── finlandsverige.alephseq ├── forfattning.alephseq ├── hawking.alephseq ├── holding.alephseq ├── hulluntaivaassa.alephseq ├── jakaja.alephseq ├── jatuli.alephseq ├── kalastusalue.alephseq ├── kollaakestaa.alephseq ├── kolmestilaukeava.alephseq ├── kotkankasvisto.alephseq ├── kotona.alephseq ├── langpart.alephseq ├── monot.alephseq ├── origwork.alephseq ├── part-uri.alephseq ├── peruskartta.alephseq ├── poliisi.alephseq ├── prepub.alephseq ├── punataudista.alephseq ├── raamattu.alephseq ├── sioninwirret.alephseq ├── sjubroder.alephseq ├── slice.alephseq ├── suoja-pirtti.alephseq ├── superkumikana-cd.alephseq ├── titlepart.alephseq ├── trauma.alephseq ├── tukreidbol.alephseq ├── tvennekomedier.alephseq ├── verkkoaineisto.alephseq └── vesijohtolaitos.alephseq ├── merged └── .gitignore ├── output ├── .gitignore └── README.md ├── refdata ├── .gitignore ├── fennica-collection.ttl └── fennica-dates.csv.gz ├── scripts ├── slices └── .gitignore ├── sparql ├── split-input └── .gitignore └── test_helper.bash /.travis.yml: -------------------------------------------------------------------------------- 1 | dist: trusty 2 | language: generic 3 | cache: 4 | directories: 5 | - $HOME/perl5 6 | - $HOME/git 7 | - $HOME/.m2 8 | addons: 9 | apt: 10 | packages: 11 | - libxml2-utils 12 | - xsltproc 13 | before_install: 14 | # Perl dependencies i.e. Catmandu 15 | - curl -L https://cpanmin.us | perl - -l ~/perl5 App::cpanminus local::lib 16 | - eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib` 17 | - echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.profile 18 | - cpanm Catmandu Catmandu::MARC 19 | # Apache Jena dependency 20 | - wget https://repository.apache.org/content/repositories/releases/org/apache/jena/apache-jena/3.1.1/apache-jena-3.1.1.tar.gz -O /tmp/apache-jena-3.1.1.tar.gz 21 | - tar -xzf /tmp/apache-jena-3.1.1.tar.gz 22 | - export PATH=$PATH:$PWD/apache-jena-3.1.1/bin/ 23 | # marc2bibframe2 dependency 24 | - git clone --depth 1 --branch v1.5.0 https://github.com/lcnetdev/marc2bibframe2.git ../marc2bibframe2 25 | # hdt-cpp dependency 26 | # first we need serd... 27 | - mkdir -p $HOME/local 28 | - export PATH=$PATH:$HOME/local/bin 29 | - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/local/lib 30 | - curl -s http://download.drobilla.net/serd-0.28.0.tar.bz2 | tar -xj 31 | - pushd serd-* && ./waf configure --prefix=$HOME/local && ./waf && ./waf install && popd 32 | # ...then actual hdt-cpp 33 | - pushd $HOME/git 34 | - if [ ! -d hdt-cpp ]; then git clone --depth 1 https://github.com/rdfhdt/hdt-cpp.git; fi 35 | - cd hdt-cpp 36 | - git pull 37 | - ./autogen.sh 38 | - PKG_CONFIG_PATH=$HOME/local/lib/pkgconfig ./configure 39 | - make -j2 40 | - ln -s $PWD/libhdt/tools/* $HOME/local/bin 41 | - popd 42 | # hdt-java dependency 43 | - pushd $HOME/git 44 | - if [ ! -d hdt-java ]; then git clone --depth 1 https://github.com/rdfhdt/hdt-java.git; fi 45 | - pushd hdt-java && git pull && mvn install && cd hdt-java-package && mvn assembly:single && popd 46 | - ln -s $PWD/hdt-java/hdt-java-package/target/hdt-java-package-*-distribution/hdt-java-package-* $HOME/local/hdt-java-package 47 | - export PATH=$PATH:$HOME/local/hdt-java-package/bin 48 | - popd 49 | script: 50 | - cd test 51 | - bats . 52 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Creative Commons Legal Code 2 | 3 | CC0 1.0 Universal 4 | 5 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE 6 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN 7 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS 8 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES 9 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS 10 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM 11 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED 12 | HEREUNDER. 13 | 14 | Statement of Purpose 15 | 16 | The laws of most jurisdictions throughout the world automatically confer 17 | exclusive Copyright and Related Rights (defined below) upon the creator 18 | and subsequent owner(s) (each and all, an "owner") of an original work of 19 | authorship and/or a database (each, a "Work"). 20 | 21 | Certain owners wish to permanently relinquish those rights to a Work for 22 | the purpose of contributing to a commons of creative, cultural and 23 | scientific works ("Commons") that the public can reliably and without fear 24 | of later claims of infringement build upon, modify, incorporate in other 25 | works, reuse and redistribute as freely as possible in any form whatsoever 26 | and for any purposes, including without limitation commercial purposes. 27 | These owners may contribute to the Commons to promote the ideal of a free 28 | culture and the further production of creative, cultural and scientific 29 | works, or to gain reputation or greater distribution for their Work in 30 | part through the use and efforts of others. 31 | 32 | For these and/or other purposes and motivations, and without any 33 | expectation of additional consideration or compensation, the person 34 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she 35 | is an owner of Copyright and Related Rights in the Work, voluntarily 36 | elects to apply CC0 to the Work and publicly distribute the Work under its 37 | terms, with knowledge of his or her Copyright and Related Rights in the 38 | Work and the meaning and intended legal effect of CC0 on those rights. 39 | 40 | 1. Copyright and Related Rights. A Work made available under CC0 may be 41 | protected by copyright and related or neighboring rights ("Copyright and 42 | Related Rights"). Copyright and Related Rights include, but are not 43 | limited to, the following: 44 | 45 | i. the right to reproduce, adapt, distribute, perform, display, 46 | communicate, and translate a Work; 47 | ii. moral rights retained by the original author(s) and/or performer(s); 48 | iii. publicity and privacy rights pertaining to a person's image or 49 | likeness depicted in a Work; 50 | iv. rights protecting against unfair competition in regards to a Work, 51 | subject to the limitations in paragraph 4(a), below; 52 | v. rights protecting the extraction, dissemination, use and reuse of data 53 | in a Work; 54 | vi. database rights (such as those arising under Directive 96/9/EC of the 55 | European Parliament and of the Council of 11 March 1996 on the legal 56 | protection of databases, and under any national implementation 57 | thereof, including any amended or successor version of such 58 | directive); and 59 | vii. other similar, equivalent or corresponding rights throughout the 60 | world based on applicable law or treaty, and any national 61 | implementations thereof. 62 | 63 | 2. Waiver. To the greatest extent permitted by, but not in contravention 64 | of, applicable law, Affirmer hereby overtly, fully, permanently, 65 | irrevocably and unconditionally waives, abandons, and surrenders all of 66 | Affirmer's Copyright and Related Rights and associated claims and causes 67 | of action, whether now known or unknown (including existing as well as 68 | future claims and causes of action), in the Work (i) in all territories 69 | worldwide, (ii) for the maximum duration provided by applicable law or 70 | treaty (including future time extensions), (iii) in any current or future 71 | medium and for any number of copies, and (iv) for any purpose whatsoever, 72 | including without limitation commercial, advertising or promotional 73 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each 74 | member of the public at large and to the detriment of Affirmer's heirs and 75 | successors, fully intending that such Waiver shall not be subject to 76 | revocation, rescission, cancellation, termination, or any other legal or 77 | equitable action to disrupt the quiet enjoyment of the Work by the public 78 | as contemplated by Affirmer's express Statement of Purpose. 79 | 80 | 3. Public License Fallback. Should any part of the Waiver for any reason 81 | be judged legally invalid or ineffective under applicable law, then the 82 | Waiver shall be preserved to the maximum extent permitted taking into 83 | account Affirmer's express Statement of Purpose. In addition, to the 84 | extent the Waiver is so judged Affirmer hereby grants to each affected 85 | person a royalty-free, non transferable, non sublicensable, non exclusive, 86 | irrevocable and unconditional license to exercise Affirmer's Copyright and 87 | Related Rights in the Work (i) in all territories worldwide, (ii) for the 88 | maximum duration provided by applicable law or treaty (including future 89 | time extensions), (iii) in any current or future medium and for any number 90 | of copies, and (iv) for any purpose whatsoever, including without 91 | limitation commercial, advertising or promotional purposes (the 92 | "License"). The License shall be deemed effective as of the date CC0 was 93 | applied by Affirmer to the Work. Should any part of the License for any 94 | reason be judged legally invalid or ineffective under applicable law, such 95 | partial invalidity or ineffectiveness shall not invalidate the remainder 96 | of the License, and in such case Affirmer hereby affirms that he or she 97 | will not (i) exercise any of his or her remaining Copyright and Related 98 | Rights in the Work or (ii) assert any associated claims and causes of 99 | action with respect to the Work, in either case contrary to Affirmer's 100 | express Statement of Purpose. 101 | 102 | 4. Limitations and Disclaimers. 103 | 104 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 105 | surrendered, licensed or otherwise affected by this document. 106 | b. Affirmer offers the Work as-is and makes no representations or 107 | warranties of any kind concerning the Work, express, implied, 108 | statutory or otherwise, including without limitation warranties of 109 | title, merchantability, fitness for a particular purpose, non 110 | infringement, or the absence of latent or other defects, accuracy, or 111 | the present or absence of errors, whether or not discoverable, all to 112 | the greatest extent permissible under applicable law. 113 | c. Affirmer disclaims responsibility for clearing rights of other persons 114 | that may apply to the Work or any use thereof, including without 115 | limitation any person's Copyright and Related Rights in the Work. 116 | Further, Affirmer disclaims responsibility for obtaining any necessary 117 | consents, permissions or other rights required for any use of the 118 | Work. 119 | d. Affirmer understands and acknowledges that Creative Commons is not a 120 | party to this document and has no duty or obligation with respect to 121 | this CC0 or use of the Work. 122 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # Paths to non-unix-standard tools that we depend on; can be overridden on the command line 2 | 3 | CATMANDU=catmandu 4 | MARC2BIBFRAME2=$(PATH_PREFIX)../marc2bibframe2 5 | XSLTPROC=xsltproc 6 | RSPARQL=rsparql 7 | RIOT=riot 8 | SPARQL=sparql 9 | UCONV=uconv 10 | RDF2HDT=rdf2hdt 11 | HDTSEARCH=hdtSearch 12 | HDTSPARQL=hdtsparql.sh 13 | 14 | # Other configuration settings 15 | FINTOSPARQL=http://api.dev.finto.fi/sparql 16 | URIBASEFENNICA=http://urn.fi/URN:NBN:fi:bib:me: 17 | JVMARGS="-Xmx4G" 18 | 19 | # Pattern rules used internally 20 | 21 | split-input/%.md5: input/%.alephseq 22 | scripts/split-input.sh $(patsubst %.md5,%,$@) <$^ 23 | cd split-input; md5sum $(patsubst split-input/%.md5,%,$@)-*-in.alephseq >`basename $@` 24 | 25 | %.md5: % 26 | md5sum $^ >$@ 27 | 28 | slices/%.md5: split-input/%.md5 29 | scripts/update-slices.sh $^ $@ 30 | 31 | refdata/subst-260c.csv: refdata/fennica-dates.csv.gz 32 | zcat $^ | scripts/extract-subst-260c.py >$@ 33 | 34 | refdata/iso639-2-fi.csv: sparql/extract-iso639-2-fi.rq 35 | $(RSPARQL) --service $(FINTOSPARQL) --query $^ --results=CSV >$@ 36 | 37 | refdata/iso639-1-2-mapping.nt: sparql/extract-iso639-1-2-mapping.rq 38 | $(RSPARQL) --service $(FINTOSPARQL) --query $^ --results=NT >$@ 39 | 40 | refdata/cn-labels.nt: sparql/extract-cn-labels.rq 41 | $(RSPARQL) --service $(FINTOSPARQL) --query $^ --results=NT >$@ 42 | 43 | refdata/RDACarrierType.nt: 44 | curl -H 'Accept: text/html' -s http://rdaregistry.info/termList/RDACarrierType.nt >$@ 45 | 46 | refdata/RDAContentType.nt: 47 | curl -H 'Accept: text/html' -s http://rdaregistry.info/termList/RDAContentType.nt | sed -e 's|RDAContentType//|RDAContentType/|g' >$@ 48 | 49 | refdata/RDAMediaType.nt: 50 | curl -H 'Accept: text/html' -s http://rdaregistry.info/termList/RDAMediaType.nt >$@ 51 | 52 | %-preprocessed.alephseq: %-in.alephseq 53 | uniq $< | scripts/filter-duplicates.py | $(UCONV) -x Any-NFC -i | scripts/filter-fennica-repl.py >$@ 54 | 55 | %.mrcx: %-preprocessed.alephseq refdata/iso639-2-fi.csv refdata/subst-260c.csv 56 | $(CATMANDU) convert MARC --type ALEPHSEQ to MARC --type XML --fix scripts/filter-marc.fix --fix scripts/strip-personal-info.fix --fix scripts/preprocess-marc.fix --fix scripts/substitute-marc.fix <$< >$@ 57 | 58 | %-bf2.rdf: %.mrcx 59 | $(XSLTPROC) --stringparam baseuri $(URIBASEFENNICA) $(MARC2BIBFRAME2)/xsl/marc2bibframe2.xsl $^ >$@ 60 | 61 | %.nt: %.rdf 62 | $(RIOT) -q $^ >$@ 63 | 64 | %-rewritten.nt: %-bf2.nt 65 | scripts/rewrite-uris.py $^ | scripts/filter-bad-ntriples.py >$@ 2>$(patsubst %.nt,%.log,$@) 66 | 67 | %-schema.nt: %-rewritten.nt 68 | JVM_ARGS=$(JVMARGS) $(SPARQL) --graph $< --query sparql/bf-to-schema.rq --out=NT | scripts/filter-bad-ntriples.py >$@ 2>$(patsubst %.nt,%.log,$@)>$@ 69 | 70 | %-reconciled.nt: %-schema.nt refdata/iso639-1-2-mapping.nt refdata/RDACarrierType.nt refdata/RDAContentType.nt refdata/RDAMediaType.nt refdata/cn-labels.nt 71 | JVM_ARGS=$(JVMARGS) $(SPARQL) --graph $< --namedGraph $(word 2,$^) --namedGraph $(word 3,$^) --namedGraph $(word 4,$^) --namedGraph $(word 5,$^) --namedGraph $(word 6,$^) --query sparql/reconcile.rq --out=NT >$@ 72 | 73 | %-work-keys.nt: %-rewritten.nt 74 | JVM_ARGS=$(JVMARGS) $(SPARQL) --data $< --query sparql/create-work-keys.rq --out=NT >$@ 75 | 76 | .SECONDEXPANSION: 77 | refdata/%-work-keys.nt: $$(shell ls slices/$$(*)-?????-in.alephseq | sed -e 's/-in.alephseq/-work-keys.nt/') 78 | $(RIOT) $^ >$@ 79 | 80 | refdata/%-agent-keys.nt: $$(shell ls slices/$$(*)-?????-in.alephseq | sed -e 's/-in.alephseq/-agent-keys.nt/') 81 | $(RIOT) $^ >$@ 82 | 83 | %-transformations.nt: %-keys.nt 84 | scripts/create-merge-transformations.py <$^ >$@ 85 | 86 | slices/%-merged.nt: slices/%-reconciled.nt refdata/$$(shell echo $$(*)|sed -e 's/-[0-9X]\+//')-work-transformations.nt 87 | $(SPARQL) --data $< --data $(word 2,$^) --query sparql/merge.rq --out=NT >$@ 88 | 89 | slices/%-agent-keys.nt: slices/%-merged.nt 90 | JVM_ARGS=$(JVMARGS) $(SPARQL) --data $< --query sparql/create-agent-keys.rq --out=NT >$@ 91 | 92 | slices/%-merged2.nt: slices/%-merged.nt refdata/$$(shell echo $$(*)|sed -e 's/-[0-9X]\+//')-agent-transformations.nt 93 | $(SPARQL) --data $< --data $(word 2,$^) --query sparql/merge.rq --out=NT >$@ 94 | 95 | merged/%.mrcx: $$(shell ls slices/$$(*)-?????-in.alephseq | sed -e 's/-in.alephseq/-preprocessed.alephseq/') 96 | cat $^ | $(CATMANDU) convert MARC --type ALEPHSEQ to MARC --type XML --pretty 1 --fix scripts/filter-marc.fix --fix scripts/strip-personal-info.fix >$@ 97 | 98 | merged/%-merged.nt: $$(shell ls slices/$$(*)-?????-in.alephseq | sed -e 's/-in.alephseq/-merged2.nt/') refdata/fennica-collection.ttl 99 | $(RIOT) $^ >$@ 100 | 101 | %.hdt: %.nt 102 | $(RDF2HDT) $< $@ 103 | # also (re)generate index, for later querying 104 | rm -f $@.index* 105 | $(HDTSEARCH) -q 0 $@ 106 | 107 | output/%.nt: merged/%-merged.hdt 108 | JAVA_OPTIONS=$(JVMARGS) $(HDTSPARQL) $^ "`cat sparql/consolidate-works.rq`" >$@ 109 | 110 | # Targets to be run externally 111 | 112 | all: slice consolidate 113 | 114 | realclean: clean 115 | rm -f split-input/*.alephseq split-input/*.md5 116 | rm -f slices/*.alephseq slices/*.md5 117 | rm -f refdata/*.csv refdata/*.nt 118 | 119 | clean: 120 | rm -f refdata/*-work-keys.nt refdata/*-work-transformations.nt 121 | rm -f slices/*-preprocessed.alephseq 122 | rm -f slices/*.mrcx 123 | rm -f slices/*.rdf 124 | rm -f slices/*.nt slices/*.log 125 | rm -f merged/*.nt merged/*.mrcx 126 | 127 | slice: $(patsubst input/%.alephseq,slices/%.md5,$(wildcard input/*.alephseq)) 128 | 129 | preprocess: $(patsubst %-in.alephseq,%-preprocessed.alephseq,$(wildcard slices/*-in.alephseq)) 130 | 131 | marcdist: $(patsubst input/%.alephseq,merged/%.mrcx,$(wildcard input/*.alephseq)) 132 | 133 | mrcx: $(patsubst %-in.alephseq,%.mrcx,$(wildcard slices/*-in.alephseq)) 134 | 135 | rdf: $(patsubst %-in.alephseq,%-bf2.rdf,$(wildcard slices/*-in.alephseq)) 136 | 137 | rewrite: $(patsubst %-in.alephseq,%-rewritten.nt,$(wildcard slices/*-in.alephseq)) 138 | 139 | work-keys: $(patsubst %-in.alephseq,%-work-keys.nt,$(wildcard slices/*-in.alephseq)) 140 | 141 | work-transformations: $(patsubst input/%.alephseq,refdata/%-work-transformations.nt,$(wildcard input/*.alephseq)) 142 | 143 | schema: $(patsubst %-in.alephseq,%-schema.nt,$(wildcard slices/*-in.alephseq)) 144 | 145 | reconcile: $(patsubst %-in.alephseq,%-reconciled.nt,$(wildcard slices/*-in.alephseq)) 146 | 147 | agent-keys: $(patsubst %-in.alephseq,%-agent-keys.nt,$(wildcard slices/*-in.alephseq)) 148 | 149 | agent-transformations: $(patsubst input/%.alephseq,refdata/%-agent-transformations.nt,$(wildcard input/*.alephseq)) 150 | 151 | merge: $(patsubst input/%.alephseq,merged/%-merged.nt,$(wildcard input/*.alephseq)) 152 | 153 | consolidate: $(patsubst input/%.alephseq,output/%.nt,$(wildcard input/*.alephseq)) 154 | 155 | .PHONY: all realclean clean slice preprocess mrcx rdf rewrite work-keys schema merge consolidate 156 | .DEFAULT_GOAL := all 157 | 158 | # retain all intermediate files 159 | .SECONDARY: 160 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ARCHIVED 2 | This repository is archived and is not maintained anymore. 3 | 4 | [![Build Status](https://travis-ci.org/NatLibFi/bib-rdf-pipeline.svg?branch=master)](https://travis-ci.org/NatLibFi/bib-rdf-pipeline) 5 | 6 | # bib-rdf-pipeline 7 | 8 | This repository contains various scripts and configuration for converting MARC bibliographic records into RDF, for use at the National Library of Finland. 9 | 10 | The main component is a conversion pipeline driven by a Makefile that defines rules for realizing the conversion steps using command line tools. 11 | 12 | The steps of the conversion are: 13 | 14 | 1. Start with a file of MARC records in Aleph sequential format 15 | 2. Split the file into smaller batches 16 | 3. Preprocess using unix tools such as grep and sed, to remove some local peculiarities 17 | 4. Convert to MARCXML and enrich the MARC records, using Catmandu 18 | 5. Run the Library of Congress marc2bibframe2 XSLT conversion from MARC to BIBFRAME RDF 19 | 6. Convert the BIBFRAME RDF/XML data into N-Triples format and fix up some bad URIs 20 | 7. Calculate work keys (e.g. author+title combination) used later for merging data about the same creative work 21 | 8. Convert the BIBFRAME data into Schema.org RDF in N-Triples format 22 | 9. Reconcile entities in the Schema.org data against external sources (e.g. YSA/YSO, Corporate names authority, RDA vocabularies) 23 | 10. Merge the Schema.org data about the same works 24 | 11. Calculate agent keys used for merging data about the same agent (person or organization) 25 | 12. Merge the agents based on agent keys 26 | 13. Convert the raw Schema.org data to HDT format so the full data set can be queried with SPARQL from the command line 27 | 14. Consolidate the data by e.g. rewriting URIs and moving subjects into the original work 28 | 15. Convert the consolidated data to HDT 29 | 16. ??? (TBD) 30 | 17. Profit! 31 | 32 | # Dependencies 33 | 34 | Command line tools are assumed to be available in `$PATH`, but the paths can be overridden on the make command line, e.g. `make CATMANDU=/opt/catmandu` 35 | 36 | ## For running the main suite 37 | 38 | * [Apache Jena](http://jena.apache.org/) command line utilities `sparql` and `rsparql` 39 | * [Catmandu](http://librecat.org/Catmandu/) utility `catmandu` 40 | * `uconv` utility from Ubuntu package `icu-devtools` 41 | * `xsltproc` utility from Ubuntu package `xsltproc` 42 | * [hdt-cpp](https://github.com/rdfhdt/hdt-cpp) command line utilities `rdf2hdt` and `hdtSearch` 43 | * [hdt-java](https://github.com/rdfhdt/hdt-java) command line utility `hdtsparql.sh` 44 | 45 | ## For running the unit tests 46 | 47 | In addition to above: 48 | 49 | * [bats](https://github.com/sstephenson/bats) in $PATH 50 | * `xmllint` utility from Ubuntu package `libxml2-utils` in $PATH 51 | -------------------------------------------------------------------------------- /doc/model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NatLibFi/bib-rdf-pipeline/f016d7eb4734d96371540d70ab67c43694cf8219/doc/model.png -------------------------------------------------------------------------------- /doc/model.xml: -------------------------------------------------------------------------------- 1 | 7V1rj5u4Gv41kfZ8mBX3kI9NOt1daVYddXa1px+d4BBUgiPjzKW//phgc7G5DTGE2UNVtWCMMX4fP378+jVZmJvj628YnA5/Ig+GC0PzXhfm54Vh6Jap0f+SlLc0ZWlbaYKPA49lyhOegp+QJbL7/HPgwbiUkSAUkuBUTtyhKII7UkoDGKOXcrY9CstPPQEfSglPOxDKqf8EHjmwVN1Z5Rd+h4F/YI92DSe9sAW7Hz5G54g9b2GY+8uf9PIR8LLYi8YH4KGXQpJ5vzA3GCGSHh1fNzBM2pY3W3rfl5qrWb0xjEiXG4z0hmcQniGvsRPSW9dbeuAnB/8g/IMn0oKydPYC5I03WvwSHEMQ0bP1gRxDmqjTwz2KyBPLpNHz3SEIvQfwhs5JBWNCG4yfrQ8IBz9pfsBvppcxYfCgTUxLC8Jwg0KEaUKE0mdlNz0lhbHHYBjT2x55Q+hZ0gOICa8KCkNwioPtpXJJliPAfhCtESHoyDLxt/pSeHJuVd4MxRZnRniGmMDXQhKzwG8QHSHBbzQLu2pZDA2st5iOmZ6/5NgzeJ5DAXa6tmSYZ3j3s7Jzm9MDZvZqCJgSBOLdAR7BwvwUgSOkl+gR/fchIBBTyzAoeMFzjgQGGSym0GeX8gmIoe1DymiJCUY/oGDhCqODMPAjehrCfVJC0tYB7b6fWDJBp6SwE9gFkf9wyfPZylO+sSZMkl4O9L2eaHpSpxdKZzQN0fL24aVfHgLPg1GCHkQAAdsMxycUROTS7Paa/qXW2Wi/2gubvteGnuv5Of2bZMdkgyL6fiC4AAVSHL7AmFRCyOgMIQYZzj9tiOH5rgGMVQ+YIHoAkX9O2HWGzQeAjW2MB5uVTDTYA2eKkkdH06xVhhj6vjt4IvTol2+fWQKh7/ifGQiDAWHpjgiEZYXoECwLI+9TouPo2S4EcRzsynaGHtVrLDttmQPyUQTC+zw1lQ5yGZfkZCznBUVe4ay2JWN0xjtYSkqq0Ni0GIaABM9lSVnVcOzWxwQRuSq4E1TBnWmWi0jrxO4qajyhIEMoaCmIBtoiPiRSObTtwFshGwNsbX1NvfwYZua6WonZl6Xs9CB9fo6orGW7gcytH6VoH4rixDYo+rpP5a0Av4tULHTWAvJamGPLtOM6BFsYrrPpQJV0vEjjVNzqWiX6eFdh8xxWo0zVv0Nj3jH89QUls5IuYAft9zEkguXebatVva1eqHn+yu3Vx1I4pa8PY6orLcVL0S2BPgawnK5pkukG4HL4GpD/MgMnx9+TYzo4CizPxvYixWv9KN4aieINgQRdtx/F6+VShiH4u2W5so7dWCcxu6uW4HVN9l1krAG2iUNhslyRdZupkMVdGUC8Gkq5Qh6QJVfTH1TfAir+Z3fTkO4mV3I3sfNW8d8BWN8SOEd+CAvuLUcT0LWSnud2mGuAkEAcAQLXSc+LrxUd9exR7faa557d5p5uZzzewHely3olM7sH4x0OTqnMnK0/kvXHdEHpeoP1KbE8nrdhEB+gl9k/SZ2NP5jxx3Q7WQ1+6+h83EL8df8IfBhnxqdvDH2IZ/sPZn9ds0YEgF0PgDMOM7P//e2P2eTDmdzsqjZVEL6s8gprDra2qF1z+BN6AZhXHAbEgT3mkmXz2pNbj4MNwDiAeEbCgEhwR5SARpXDUnBDPEIcJ3OA2QkxnBMic4FxEKw6Dgu6rilAQZMWnINebrRo3d35eRPPQQNmtgEmh8+XuSIDTnoyo2YQ1EgIqQLSNDwOWkN4nQfBjJqPgpoxXRWGPFOVREqmVGeVMp5KsbqqFEuFSJEnrxIKvmIfRMFPFhsxQ2G8IO3MxG1QcBRAwZRnLbNevbleXXXG0Hv1qqUAMh3YY4PhJWogiYF7gjhIfN8zh4zHIY7V0f2tgkOses9HofvnofxxXLEMOjPGNYxhDscYKpykhgSQ+1cCeahFTUjfNkRJX0yi7HjQk7MoBt0JkVa0MfDbJZjvEsB3Of3Or/E4v/QSj/Rr6nzFqD3evGm8G2uYNKk1kq/QwDrvbVcGVdlC3IvtCLTeNbrPZpF2GW1oQphgTYBfj6gYy2kfNdYIzRsCR43QcnjXbKMBV8U4UbU9o36c2FI0fEH4CEg2WqyzpL/eTnAeNK4bNLIuOc1Bo2GfRRBvayXEPDOZFGTG9Ila8szkY+kM3rxFneHeTmdkS2fcU+n03EVg2i0FqdMZdv1kJF+GTaLxdhfX1v1zYo9Zc4yoOUb1b9kNgZmX5i+tksxBme8ZDLKuNkk3lf2+zcC8uw2wE7gT9RsVU0zewEPvFnOEDVWG3ZPnXbOlIEUbxpa2+ByzsV4t+a/eMmY3aFWULqRURPtOZS+wPZm9wNwtUTLWnV2+X8meMaeLTAjBvGNsXG2g6x0Xw1VoA6dBG8xrXzcSFc5wokLBDNORPdmqRUVhemnUzi/58fc8n1IxYstipKu/+0ruNwTftmX01CKW0VKQIi1iC5Ec/FyVtnAa4rx670YfRVfwzjIZXSF8E0EXCEGNsKiKsFLMEJmTySh6mcofHdJUU4J2O0oQpieZN+ndlGC2FKSIEnSRw3TFlCCvpeWUcKaQme5cg3ePyXCC+DEs0fWghhSqQmaGIgWRE/4tLGBqv5qFP3x9iPdlcfdGZ1IQP1rhCsOCIlIwBD1irtSSwlKe0WakQHsbwcH2TKbMDKuJM4Mp6EclzLCU56DDMcPyX0oN+nIgahC77EB6IYuu4M9ZKqYGedb6QaYQvHtMlhT48rZaUpCnfKpJ4dqeP/iShOCxN7WefdgVJw+i51BRH66rcF29pPxmc37pPUzFHNGwCfHEvl4zXfHAe8xkeWKQaYUrS74mnrjt9475r230CG25lkvE4XXVl0tqJLzy5U2ncarw3vxXc4PbsFACX8HxFMKJf+6YI+D2/JB9mmIIPmjQecnnju9TW/Wx0jifL1VnJjVWGuTTxu701V1xXse55RaBKa7A3EZfFahr4ngslqSIulfiJ0n1ZupuyX89dTfIuhDten/6fBzW/v9UdR8rcM2u4IeRhJ1ID6b4eene9CCVNBA9tM36WvJfTw8NgWunPEp6ugwxtdC1URiCTzs+CENUhbYa4zCE+AM14ja2zr90o7UUpCqY5J380JL/an5YNcz8pu055n1kOswgxkYPwgyy3GtihjE9QoW4tmUpro3/9kr177B0Yhi9gmH4nu2hKcZ2y+HKthhW1JVjHCE8SdrVrcpTLXixbMbPyjij4WvIBxA/UpBMlzWsqbHGSpwfDsEaDfFEwcVgX/d9TDbS72Mps5kak4m/rqcrIHp6mv90c5o9/31s8/5/ -------------------------------------------------------------------------------- /input/.gitignore: -------------------------------------------------------------------------------- 1 | *.alephseq 2 | -------------------------------------------------------------------------------- /input/README.md: -------------------------------------------------------------------------------- 1 | This directory is for storing original MARC records dumped from an ILS. 2 | -------------------------------------------------------------------------------- /merged/.gitignore: -------------------------------------------------------------------------------- 1 | *.nt 2 | *.hdt 3 | *.hdt.index* 4 | *.mrcx 5 | -------------------------------------------------------------------------------- /output/.gitignore: -------------------------------------------------------------------------------- 1 | *.nt 2 | *.hdt 3 | *.hdt.index* 4 | -------------------------------------------------------------------------------- /output/README.md: -------------------------------------------------------------------------------- 1 | Final output files of the conversion process will be placed here. 2 | -------------------------------------------------------------------------------- /refdata/.gitignore: -------------------------------------------------------------------------------- 1 | *.nt 2 | *.csv 3 | 4 | -------------------------------------------------------------------------------- /refdata/README.md: -------------------------------------------------------------------------------- 1 | This directory contains reference data (e.g. CSV and NT files) used during the conversion process. 2 | These are used e.g. for processing and enriching language codes and YSA subjects. 3 | -------------------------------------------------------------------------------- /refdata/fennica-collection.ttl: -------------------------------------------------------------------------------- 1 | @prefix schema: . 2 | @prefix me: . 3 | @prefix cn: . 4 | 5 | me:CFENNI a schema:Collection ; 6 | schema:name "Fennica" ; 7 | schema:description "Finnish national bibliography" ; 8 | schema:producer cn:146806A ; 9 | schema:provider cn:146806A . 10 | 11 | -------------------------------------------------------------------------------- /refdata/fennica-dates.csv.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NatLibFi/bib-rdf-pipeline/f016d7eb4734d96371540d70ab67c43694cf8219/refdata/fennica-dates.csv.gz -------------------------------------------------------------------------------- /scripts/create-merge-transformations.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import re 4 | import sys 5 | 6 | 7 | keys_for_uri = {} 8 | uris_for_key = {} 9 | 10 | for line in sys.stdin: 11 | s,p,o = line.split(None, 2) 12 | uri = s[1:-1] 13 | key = o.split('"')[1] 14 | keys_for_uri.setdefault(uri, []) 15 | keys_for_uri[uri].append(key) 16 | uris_for_key.setdefault(key, []) 17 | uris_for_key[key].append(uri) 18 | 19 | def traverse_uris(uri): 20 | """return all the URIs that directly or indirectly share keys with the given URI""" 21 | seen = set() 22 | uris_to_check = [uri] 23 | while len(uris_to_check) > 0: 24 | uri = uris_to_check.pop() 25 | if uri not in seen: 26 | seen.add(uri) 27 | for key in keys_for_uri[uri]: 28 | for uri2 in uris_for_key[key]: 29 | if uri2 not in seen: 30 | uris_to_check.append(uri2) 31 | 32 | return seen 33 | 34 | def uri_sort_key(uri): 35 | """return a sort key for the given URI, based on whether it represents the primary work in the record""" 36 | if uri.startswith('http://urn.fi/URN:NBN:fi:bib:me:'): 37 | priority = int(uri[-2:]) # last two digits are 00 for the primary work, 01+ for other works mentioned 38 | else: 39 | priority = -1 # higher priority for e.g. authorized agents 40 | return (priority, uri) 41 | 42 | def select_uri(uris): 43 | """return the most appropriate URI from the given set of URIs""" 44 | return sorted(uris, key=uri_sort_key)[0] 45 | 46 | uri_replacement = {} # cache for storing already computed replacements 47 | 48 | for uri in keys_for_uri.keys(): 49 | if uri not in uri_replacement: 50 | uris = traverse_uris(uri) 51 | if len(uris) > 1: 52 | replacement = select_uri(uris) 53 | for uri2 in uris: # store in cache for all URIs in the merged set 54 | uri_replacement[uri2] = replacement 55 | if uri in uri_replacement and uri_replacement[uri] != uri: 56 | print "<%s> <%s> ." % (uri, uri_replacement[uri]) 57 | -------------------------------------------------------------------------------- /scripts/create-urn-url-mappings.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | """Read an N-Triple file on stdin, produce an XML file on stdout with URN to URL mappings for the URN.fi resolver.""" 4 | 5 | import sys 6 | 7 | seen = set() 8 | 9 | 10 | def emit_header(): 11 | print """ 12 | 13 | 3.0""" 14 | 15 | 16 | def emit_mapping(urn, url): 17 | print """ 18 |
19 | %s 20 | 21 | 22 | %s 23 | 24 | 25 |
26 |
""" % (urn, url) 27 | 28 | def emit_footer(): 29 | print "
" 30 | 31 | emit_header() 32 | 33 | for line in sys.stdin: 34 | s,p,o = line.split(None, 2) 35 | if p != '': 36 | continue 37 | s = s[1:-1] # strip brackets 38 | if s in seen: 39 | continue 40 | if not s.startswith('http://urn.fi/URN:NBN:fi:bib:me:'): 41 | continue 42 | seen.add(s) 43 | urn = s.replace('http://urn.fi/', '') 44 | url = urn.replace('URN:NBN:fi:bib:me:', 'http://data.nationallibrary.fi/bib/me/') 45 | emit_mapping(urn, url) 46 | 47 | emit_footer() 48 | -------------------------------------------------------------------------------- /scripts/extract-subst-260c.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import sys 4 | import csv 5 | 6 | reader = csv.reader(sys.stdin, dialect='excel-tab') 7 | writer = csv.writer(sys.stdout, quoting=csv.QUOTE_ALL) 8 | 9 | for lineno, row in enumerate(reader): 10 | if lineno == 0: 11 | continue # skip header 12 | 13 | recid = row[0] 14 | orig260c = row[1] 15 | new260c_from = row[4] 16 | new260c_till = row[5] 17 | 18 | key = recid + "/" + orig260c 19 | val = new260c_from 20 | 21 | if new260c_till: 22 | val += "-" + new260c_till 23 | 24 | # skip trivial cases (already handled by conversion) 25 | if orig260c == val: 26 | continue 27 | 28 | if orig260c == val + ".": 29 | continue 30 | 31 | if orig260c == val + "-": 32 | continue 33 | 34 | if orig260c == val + "-.": 35 | continue 36 | 37 | if orig260c == "[" + val + "]": 38 | continue 39 | 40 | if orig260c == "[" + val + "].": 41 | continue 42 | 43 | 44 | writer.writerow([key, val]) 45 | -------------------------------------------------------------------------------- /scripts/filter-bad-ntriples.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import re 4 | import sys 5 | import urllib 6 | 7 | # Attempts to parse N-Triples from stdin using an approximation of the N-triples grammar. 8 | # Valid triples are passed through to stdout. 9 | # Some special characters in IRIs are escaped, repairing the IRI if possible. 10 | # Warning messages about bad triples are output on stderr. 11 | # 12 | # Currently unchecked cases (TODO): 13 | # - detailed checking of language tags and datatypes 14 | # - checking of valid/invalid characters in blank node identifiers 15 | # - lines with comments will be rejected even though they may be valid 16 | 17 | IRIREF = r'<[^\x00-\x20<>"{}|^`\\]*>' 18 | BNODE = r'_:\S+' 19 | LITERAL = r'".*"\S*' 20 | TRIPLE = '(%s|%s)\s+%s\s+(%s|%s|%s)\s.' % (IRIREF, BNODE, IRIREF, IRIREF, LITERAL, BNODE) 21 | TRIPLE_RE = re.compile(TRIPLE) 22 | QUOTE = r'[{}|^`\\]' 23 | QUOTE_RE = re.compile(QUOTE) 24 | 25 | def quote(match): 26 | return urllib.quote(match.group(0)) 27 | 28 | 29 | for line in sys.stdin: 30 | if TRIPLE_RE.match(line): 31 | print line, 32 | else: 33 | quoted = QUOTE_RE.sub(quote, line) 34 | if TRIPLE_RE.match(quoted): 35 | print >>sys.stderr, "SYNTAX ERROR, quoting: ", line, 36 | print quoted, 37 | else: 38 | print >>sys.stderr, "SYNTAX ERROR, skipping:", line, 39 | 40 | -------------------------------------------------------------------------------- /scripts/filter-duplicates.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | # Processes an Aleph sequence and filters away inappropriate duplicate 4 | # MARC fields including 001 and 005. 5 | 6 | import sys 7 | import re 8 | 9 | FIELDS=['LDR','001','005','100','245'] 10 | seen = set() 11 | 12 | for line in sys.stdin: 13 | recid = line[:9] 14 | fld = line[10:13] 15 | # only one of 100,110,111,130 should exist 16 | fld = fld.replace('110','100') 17 | fld = fld.replace('111','100') 18 | fld = fld.replace('130','100') 19 | if fld in FIELDS: 20 | tag = (recid, fld) 21 | if tag in seen: 22 | continue # skip 23 | seen.add(tag) 24 | # filter inappropriately duplicated $$2 subfields 25 | line = re.sub(r'(\$\$2[^\$]*)+', r'\1', line) 26 | print line, 27 | -------------------------------------------------------------------------------- /scripts/filter-fennica-repl.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import re 4 | import sys 5 | 6 | # Filters Fennica records from Melinda, applying Fennica replication rules 7 | # as documented here: 8 | # https://www.kiwi.fi/display/MELFENNI/Fennican+replikointiasetukset 9 | # 10 | # Input: Aleph sequence on stdin 11 | # Output: Aleph sequence on stdout 12 | 13 | # These fields will be removed unless tagged with $9FENNI 14 | REMOVE_UNLESS_KEEP_TAGGED = set([ 15 | '010', '013', '016', '017', '018', '025', '026', '027', '030', '031', '032', '037', '038', '043', '046', '047', '048', '049', '050', '051', '052', '055', '060', '061', '070', '071', '072', '074', '082', '083', '085', '086', 16 | '242', '257', '258', '270', 17 | '306', '307', '340', '342', '343', '345', '346', '351', '352', '355', '357', '363', '365', '366', '377', '380', '381', '382', '383', '384', '385', '386', 18 | '501', '507', '513', '514', '521', '522', '524', '526', '535', '536', '540', '541', '544', '545', '547', '552', '555', '556', '561', '562', '563', '565', '567', '581', '584', '585', 19 | '751', '752', '753', '754', '774', '786', 20 | '811', '850', '882', '883', '886', '887', 21 | '908', '940', 22 | 23 | '080', '084', 24 | '600', '610', '611', '630', '648', '650', '651', '653', '654', '655', '656', '657', '658', '662', 25 | '502', '504', '505', '506', '506 510', '511', '515', '518', '520', '530', '534', '538', '546', '550', '580', '588', 26 | '760', '762', '765', '767', '770', '772', '773', '774', '775', '776', '777', '780', '785', '786', '787', 27 | '960' 28 | ]) 29 | 30 | # These fields will be removed unless tagged with $5FENNI or $5FI-NL 31 | REMOVE_UNLESS_FENNI_TAGGED = set([ 32 | '583', '594', '901', '902', '903', '904', '905', '906', '935' 33 | ]) 34 | 35 | # These fields will always be removed 36 | REMOVE_ALWAYS = set([ 37 | '599', '852', 38 | '036', 39 | 'CAT', 'LOW', 'SID' 40 | ]) 41 | 42 | 43 | KEEP = re.compile(r'\$\$9FENNI') 44 | DROP = re.compile(r'\$\$9FENNI') 45 | FENNI = re.compile(r'\$\$5(FENNI|FI-NL)') 46 | OTHERTAG = re.compile(r'\$\$9\w+<(KEEP|DROP)>(,\s*\w+<(KEEP|DROP)>)*') 47 | FENNICAID = re.compile(r'\$\$c(\d+)\$\$bfenni') 48 | LINKFIELD = re.compile(r'\$\$6(\d\d\d)') 49 | 50 | for line in sys.stdin: 51 | if DROP.search(line) is not None: 52 | # found DROP tag, skipping field 53 | continue 54 | 55 | fld = line[10:13] 56 | 57 | # for 880 fields, we need to identify the linked field it refers to 58 | # and process it as if it were that field 59 | if fld == '880': 60 | match = LINKFIELD.search(line) 61 | if match is not None: 62 | fld = match.group(1) 63 | 64 | # Convert Fennica system ID from SID field to 035 field 65 | if fld == 'SID': 66 | match = FENNICAID.search(line) 67 | if match is not None: 68 | fld = '035' 69 | line = line[:10] + '035 L $$a(FI-FENNI)%s\n' % match.group(1) 70 | 71 | if fld in REMOVE_ALWAYS: 72 | # skip field that should always be removed 73 | continue 74 | 75 | if fld in REMOVE_UNLESS_KEEP_TAGGED: 76 | if KEEP.search(line) is None: 77 | # no KEEP tag found, skipping field 78 | continue 79 | # KEEP tag found, remove it 80 | line = KEEP.sub('', line) 81 | if fld in REMOVE_UNLESS_FENNI_TAGGED: 82 | if FENNI.search(line) is None: 83 | # no FENNI tag found, skipping field 84 | continue 85 | # FENNI tag found, remove it 86 | line = FENNI.sub('', line) 87 | 88 | # remove other tags 89 | line = OTHERTAG.sub('', line) 90 | 91 | print line, 92 | -------------------------------------------------------------------------------- /scripts/filter-marc.fix: -------------------------------------------------------------------------------- 1 | # Rules for filtering MARC records before distributing or conversion to RDF 2 | 3 | # Skip records that have encoding level 8 (prepublication level) 4 | reject marc_match('LDR/17', '8') 5 | 6 | -------------------------------------------------------------------------------- /scripts/preprocess-marc.fix: -------------------------------------------------------------------------------- 1 | # Rules for preprocessing MARC records before conversion to RDF 2 | 3 | # Check if this is a translated record without 240 4 | marc_map('041h',origlang) 5 | marc_map('240a',origtitle) 6 | unless exists(origtitle) 7 | # Missing 240 field 8 | # Try to add 240 from a 500 note 9 | do marc_each() 10 | if marc_match('500a', '(?i)alkuteos\s*:') 11 | marc_map('500a', origtitlenote) 12 | split_field(origtitlenote, '(?i)alkuteos\s*:') 13 | copy_field(origtitlenote.1, origtitle) 14 | trim(origtitle) 15 | marc_add('240', a, $.origtitle) 16 | # remove the 500 note since it's now redundant 17 | marc_remove('500') 18 | end 19 | end 20 | end 21 | 22 | # Set 240$l to language name, if a 240 exists without language information 23 | marc_map('240l',origtitlelang) 24 | marc_map('008_/35-37',recordlang) 25 | lookup(recordlang,"refdata/iso639-2-fi.csv") 26 | if exists(origtitle) 27 | if exists(origlang) 28 | unless exists(origtitlelang) 29 | marc_set('240l', $.recordlang) 30 | end 31 | end 32 | end 33 | 34 | # Remove 336$2 subfield (it confuses the marc2bibframe conversion) 35 | marc_remove('3362') 36 | 37 | # Remove 337$2 subfield (it confuses the marc2bibframe conversion) 38 | marc_remove('3372') 39 | 40 | # Remove 490 fields if a 830 field is present 41 | if marc_has('830') 42 | marc_remove('490') 43 | end 44 | -------------------------------------------------------------------------------- /scripts/rewrite-uris.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | """Rewrite all the marc2bibframe2-generated URIs in the input NT file; output the rewritten NT file on stdout""" 4 | 5 | import sys 6 | import re 7 | 8 | # regex for detecting URIs generated by marc2bibframe 9 | m2bf_uri = re.compile(r'(\d{9})#(Work|Instance|Agent)((\d\d\d)-(\d+))?') 10 | # regexes for matching N-Triples 11 | IRIREF = r'<[^\x00-\x20<>"{}|^`\\]*>' 12 | BNODE = r'_:\S+' 13 | LITERAL = r'".*"\S*' 14 | TRIPLE = '(%s|%s)\s+(%s)\s+(%s|%s|%s)\s.' % (IRIREF, BNODE, IRIREF, IRIREF, LITERAL, BNODE) 15 | TRIPLE_RE = re.compile(TRIPLE) 16 | 17 | 18 | def get_typeid(typename, field): 19 | """determine type ID (single letter indicating type) based on type name and optional field tag parsed from the URI""" 20 | if typename == 'Agent': 21 | if field in ('100', '600', '700'): 22 | return 'P' # Person 23 | else: 24 | return 'O' # Organization 25 | if typename == 'Instance': 26 | return 'I' 27 | if typename == 'Work': 28 | return 'W' # Work 29 | return 'X' # unknown, should never happen 30 | 31 | def collect_uris(ntfile): 32 | """Collect and parse marc2bibframe2-generated URIs from the subject URIs within a NT file, 33 | returning a sequence of dicts with the keys "uri", "recid", "type", "field", "seqno". """ 34 | uris = {} 35 | for line in ntfile: 36 | subject = line.split()[0] 37 | if subject[0] != '<': 38 | continue # a blank node, not a URI reference 39 | uri = subject[1:-1] # extract the URI itself 40 | if uri in uris: 41 | continue # already seen it 42 | m = m2bf_uri.search(uri) 43 | if m is None: 44 | continue # not a marc2bibframe2-generated URI 45 | recid = m.group(1) 46 | typename = m.group(2) 47 | field = m.group(4) 48 | seqno = int(m.group(5) or 0) 49 | typeid = get_typeid(typename, field) 50 | uris[uri] = {'uri': uri, 'recid': recid, 'typeid': typeid, 'seqno': seqno} 51 | return uris.values() 52 | 53 | def rewrite(uritag, substitutions): 54 | if uritag[0] != '<': 55 | return uritag 56 | uri = uritag[1:-1] 57 | return '<%s>' % substitutions.get(uri, uri) 58 | 59 | def rewrite_uris(ntfile, substitutions): 60 | for line in ntfile: 61 | m = TRIPLE_RE.match(line) 62 | if m is None: # no match, just pass it through (a comment perhaps?) 63 | print line, 64 | continue 65 | s = m.group(1) 66 | p = m.group(2) 67 | o = m.group(3) 68 | s = rewrite(s, substitutions) 69 | o = rewrite(o, substitutions) 70 | print "%s %s %s ." % (s, p, o) 71 | 72 | with open(sys.argv[1]) as f: 73 | # 1st pass: collect and parse URIs to determine substitutions 74 | uris = collect_uris(f) 75 | 76 | # group the URIs by record ID and entity type for renumbering 77 | groups = {} 78 | for uri in uris: 79 | key = (uri['recid'], uri['typeid']) 80 | groups.setdefault(key, []) 81 | groups[key].append(uri) 82 | 83 | # determine the new URIs to use instead of the existing ones 84 | substitutions = {} 85 | for key, group_uris in groups.iteritems(): 86 | group_uris.sort(key=lambda u:u['seqno']) 87 | if group_uris[0]['seqno'] == 0: 88 | offset = 0 89 | else: 90 | offset = 1 91 | for idx, guri in enumerate(group_uris): 92 | localname = "%s%s%02d" % (guri['typeid'], guri['recid'], idx + offset) 93 | newuri = m2bf_uri.sub(localname, guri['uri']) 94 | substitutions[guri['uri']] = newuri 95 | 96 | # rewind back to start 97 | f.seek(0) 98 | 99 | # 2nd pass: rewrite all the URIs based on the substitutions 100 | rewrite_uris(f, substitutions) 101 | -------------------------------------------------------------------------------- /scripts/split-input.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Split a sparse Aleph dump given on stdin into batches of max 10000 records 4 | 5 | outputbase=$1 6 | 7 | # 0. Remove batches from previous run 8 | 9 | rm -f $outputbase-?????-in.alephseq 10 | 11 | # 1. Split based on sequence numbers into batches of at most 10000 records 12 | 13 | awk -v base="$outputbase" '{ print $0 > base "-" substr($1,0,5) "-in.alephseq" }' 14 | 15 | # 2. Check whether it is possible to merge consecutive small files 16 | # into larger batches that are still less than 10000 records 17 | 18 | bundles=`ls $outputbase-?????-in.alephseq|sed -e 's/.-in.alephseq$//'|sort|uniq` 19 | for b in $bundles; do 20 | files=`ls $b*|wc -l` 21 | if [ $files -gt 1 ]; then 22 | # more than one file so merging may be possible 23 | count=`cat $b*|cut -c1-10|uniq|wc -l` 24 | if [ $count -lt 10000 ]; then 25 | # total less than 10000 records - we can merge 26 | cat $b?-in.alephseq >${b}-in.alephseq 27 | rm $b?-in.alephseq 28 | mv ${b}-in.alephseq ${b}X-in.alephseq 29 | fi 30 | fi 31 | done 32 | -------------------------------------------------------------------------------- /scripts/strip-personal-info.fix: -------------------------------------------------------------------------------- 1 | # Rules for stripping personal information (birth and death years) from MARC 2 | # bibliographic records 3 | 4 | do marc_each() 5 | marc_map('100a', name) 6 | replace_all(name, ',$', '') 7 | marc_map('100d', years) 8 | parse_text(years, '(\d+)-(\d*)') 9 | if greater_than(years.0, 1899) 10 | unless all_match(years.1, '\d+') 11 | marc_set('100a', $.name) 12 | marc_remove('100d') 13 | end 14 | end 15 | 16 | marc_map('600a', name) 17 | replace_all(name, ',$', '') 18 | marc_map('600d', years) 19 | parse_text(years, '(\d+)-(\d*)') 20 | if greater_than(years.0, 1899) 21 | unless all_match(years.1, '\d+') 22 | marc_set('600a', $.name) 23 | marc_remove('600d') 24 | end 25 | end 26 | 27 | marc_map('700a', name) 28 | replace_all(name, ',$', '') 29 | marc_map('700d', years) 30 | parse_text(years, '(\d+)-(\d*)') 31 | if greater_than(years.0, 1899) 32 | unless all_match(years.1, '\d+') 33 | marc_set('700a', $.name) 34 | marc_remove('700d') 35 | end 36 | end 37 | end 38 | -------------------------------------------------------------------------------- /scripts/substitute-marc.fix: -------------------------------------------------------------------------------- 1 | # Apply cleanup substitutions from CSV files to MARC records 2 | 3 | marc_map('001',recid) 4 | marc_map('260c',orig260c) 5 | if exists(orig260c) 6 | paste(substval,recid,orig260c,join_char:"/") 7 | lookup(substval,'refdata/subst-260c.csv',delete:1) 8 | if exists(substval) 9 | marc_set('260c',$.substval) 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /scripts/update-slices.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | srcmd5file=$1 4 | srcdir=`dirname $srcmd5file` 5 | dstmd5file=$2 6 | dstdir=`dirname $dstmd5file` 7 | 8 | function copy_file { 9 | echo "copying $1 to $dstdir" 10 | cp $srcdir/$1 $dstdir 11 | } 12 | 13 | # Copy the files which are new or have changed 14 | while read -r srcsum file 15 | do 16 | echo "$file: $md5" 17 | if [ -f $dstdir/$file ]; then 18 | echo "file $file found in $dstdir" 19 | if [ -f $dstmd5file ] ; then 20 | dstsum=`grep -F "$file" $dstmd5file | cut -c1-32` 21 | if [ "$srcsum" != "$dstsum" ]; then 22 | echo "$srcsum $dstsum - sums differ" 23 | copy_file $file 24 | else 25 | echo "$srcsum $dstsum - sums are same" 26 | fi 27 | else 28 | "destination md5file $dstmd5file not found" 29 | fi 30 | else 31 | echo "file $file not found in $dstdir" 32 | copy_file $file 33 | fi 34 | done < $srcmd5file 35 | 36 | # TODO: purge files from dstdir that don't exist in srcdir 37 | 38 | # Copy the md5sum file 39 | cp $srcmd5file $dstmd5file 40 | -------------------------------------------------------------------------------- /slices/.gitignore: -------------------------------------------------------------------------------- 1 | *.alephseq 2 | *.md5 3 | *.mrcx 4 | *.xml 5 | *.rdf 6 | *.nt 7 | *.ttl 8 | *.log 9 | -------------------------------------------------------------------------------- /slices/README.md: -------------------------------------------------------------------------------- 1 | This directory contains batches of records sliced from the input files that 2 | have been moved from `split-input` for processing. It will also contain 3 | files derived from the original records, such as RDF/XML files. 4 | -------------------------------------------------------------------------------- /sparql/consolidate-works.rq: -------------------------------------------------------------------------------- 1 | PREFIX schema: 2 | 3 | # TODO: actually perform consolidation 4 | # - copy schema:about between original works and translations 5 | 6 | CONSTRUCT { 7 | ?s ?p ?o . 8 | } 9 | WHERE { 10 | ?s ?p ?o . 11 | } 12 | 13 | -------------------------------------------------------------------------------- /sparql/create-agent-keys.rq: -------------------------------------------------------------------------------- 1 | PREFIX dct: 2 | PREFIX schema: 3 | PREFIX me: 4 | 5 | CONSTRUCT { 6 | ?a dct:identifier ?key . 7 | } WHERE { 8 | ?w schema:author|schema:contributor ?a . 9 | ?a schema:name ?name . 10 | BIND(STRAFTER(STR(?w), STR(me:)) AS ?workLocalName) 11 | BIND(CONCAT(?workLocalName, '/', LCASE(?name)) AS ?key) 12 | } 13 | -------------------------------------------------------------------------------- /sparql/create-work-keys.rq: -------------------------------------------------------------------------------- 1 | PREFIX rdf: 2 | PREFIX rdfs: 3 | PREFIX bf: 4 | PREFIX bflc: 5 | PREFIX madsrdf: 6 | PREFIX dct: 7 | 8 | CONSTRUCT { 9 | ?w dct:identifier ?strkey . 10 | ?w dct:identifier ?strextrakey . 11 | } WHERE { 12 | # main case, where we have both creator/contributor and title 13 | { 14 | ?w a bf:Work . 15 | 16 | ?w bf:title/rdfs:label ?title . 17 | BIND(?title AS ?fulltitle) 18 | 19 | # also try to add the translated title as an extra key, for the benefit of other 20 | # expression records which lack 240 information about the original work 21 | OPTIONAL { 22 | ?inst bf:instanceOf ?w . 23 | ?inst bf:title ?instTitle . 24 | ?instTitle bf:mainTitle ?translatedMainTitle . 25 | OPTIONAL { 26 | ?instTitle bf:subtitle ?translatedSubTitle . 27 | } 28 | BIND(COALESCE(CONCAT(?translatedMainTitle, " ", ?translatedSubTitle), 29 | ?translatedMainTitle) 30 | AS ?translatedTitle) 31 | } 32 | 33 | OPTIONAL { 34 | # case where we have a primary contibutor 35 | ?w ^bf:translationOf?/bf:contribution ?contribution . 36 | ?contribution a bflc:PrimaryContribution . 37 | ?contribution bf:agent/rdfs:label ?creator . 38 | } 39 | 40 | OPTIONAL { 41 | # fallback case where we don't have a primary contributor 42 | ?w ^bf:translationOf?/bf:contribution ?contribution . 43 | ?contribution bf:agent/rdfs:label ?creator . 44 | } 45 | 46 | OPTIONAL { 47 | # for translated works, try to guess the potential translator, based on contributors 48 | { ?w bf:note/rdfs:label "Includes translation" } UNION { ?w bf:translationOf [] } 49 | ?w bf:contribution ?translation . 50 | ?translation bf:agent ?translationAgent . 51 | ?translationAgent a bf:Person . 52 | ?translationAgent rdfs:label ?contributor . 53 | FILTER NOT EXISTS { ?translation a bflc:PrimaryContribution } 54 | BIND(COALESCE(?contributor, '-') AS ?translator) 55 | } 56 | 57 | BIND(REPLACE(LCASE(?creator), '(\\.|,)?( \\d+-\\d*)?(\\.|,?)$', '') AS ?creatorkey) 58 | BIND(REPLACE(LCASE(?translator), '(\\.|,)?( \\d+-\\d*)?(\\.|,?)$', '') AS ?translatorkey) 59 | BIND(IF(BOUND(?translator), CONCAT(?creatorkey, '/', ?translatorkey), ?creatorkey) AS ?creatorskey) 60 | BIND(CONCAT(REPLACE(LCASE(?fulltitle),'[^\\p{L}\\p{N}\\s]',''), '/', ?creatorskey) AS ?key) 61 | BIND(CONCAT(REPLACE(LCASE(?translatedTitle),'[^\\p{L}\\p{N}\\s]',''), '/', ?creatorskey) AS ?extrakey) 62 | } 63 | UNION 64 | # uniform title case (130) 65 | { 66 | ?w a bf:Work . 67 | ?w bf:hasInstance [] . # not a series 68 | ?w bf:title/rdfs:label ?title . 69 | FILTER NOT EXISTS { 70 | # has no contributors 71 | ?w bf:contribution ?contribution . 72 | } 73 | BIND(REPLACE(LCASE(?title),'[^\\p{L}\\p{N}\\s]','') AS ?key) 74 | } 75 | UNION 76 | # Series with title 77 | { 78 | ?w2 bf:hasSeries ?w . 79 | ?w a bf:Work . 80 | OPTIONAL { 81 | ?w bf:contribution/bf:agent/rdfs:label ?agent . 82 | BIND(REPLACE(LCASE(?agent),'[^\\p{L}\\p{N}\\s]','') AS ?agentkey) 83 | } 84 | ?w bf:title/bf:mainTitle ?title . 85 | BIND(REPLACE(LCASE(?title),'[^\\p{L}\\p{N}\\s]','') AS ?titlekey) 86 | BIND(COALESCE(CONCAT(?agentkey, '/', ?titlekey), ?titlekey) AS ?key) 87 | } 88 | UNION 89 | # Series with ISSN 90 | { 91 | ?w a bf:Work . 92 | ?w bf:identifiedBy ?identifier . 93 | ?identifier a bf:Issn . 94 | ?identifier rdf:value ?issn . 95 | FILTER(isIRI(?w)) 96 | FILTER(?issn != '') 97 | BIND(CONCAT("issn:", ?issn) AS ?key) 98 | } 99 | 100 | # has only title (245) but no author (1xx or 7xx) - not relevant since records with no key are simply retained 101 | 102 | # strip recurring and whitespace from keys, as well as trailing space from the title part and full key 103 | BIND(REPLACE(REPLACE(REPLACE(?key, '\\p{Z}+', ' '), ' +/', '/'), ' +$', '') AS ?strkey) 104 | BIND(REPLACE(REPLACE(REPLACE(?extrakey, '\\p{Z}+', ' '), ' +/', '/'), ' +$', '') AS ?strextrakey) 105 | } 106 | -------------------------------------------------------------------------------- /sparql/extract-cn-labels.rq: -------------------------------------------------------------------------------- 1 | PREFIX skos: 2 | 3 | CONSTRUCT { 4 | ?c skos:prefLabel ?label_str . 5 | ?c skos:altLabel ?alabel_str . 6 | } WHERE { 7 | GRAPH { 8 | ?c skos:prefLabel ?label . 9 | BIND(STR(?label) AS ?label_str) 10 | OPTIONAL { 11 | ?c skos:altLabel ?alabel 12 | BIND(STR(?alabel) AS ?alabel_str) 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /sparql/extract-iso639-1-2-mapping.rq: -------------------------------------------------------------------------------- 1 | PREFIX lvont: 2 | 3 | CONSTRUCT { 4 | ?c lvont:iso6392BCode ?iso6392bcode . 5 | ?c lvont:iso639P1Code ?iso6391code . 6 | } 7 | WHERE { 8 | GRAPH { 9 | ?c lvont:iso6392BCode ?iso6392bcode . 10 | ?c lvont:iso639P1Code ?iso6391code . 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /sparql/extract-iso639-2-fi.rq: -------------------------------------------------------------------------------- 1 | PREFIX skos: 2 | PREFIX lvont: 3 | 4 | SELECT ?code ?name { 5 | GRAPH { 6 | ?c lvont:iso6392BCode ?code . 7 | ?c skos:prefLabel|skos:altLabel ?name . 8 | FILTER(LANG(?name)='fi') 9 | FILTER(LCASE(SUBSTR(?name,1,1))=SUBSTR(?name,1,1)) 10 | } 11 | } 12 | ORDER BY ?code 13 | -------------------------------------------------------------------------------- /sparql/merge.rq: -------------------------------------------------------------------------------- 1 | PREFIX owl: 2 | 3 | CONSTRUCT { 4 | ?news ?p ?newo . 5 | } WHERE { 6 | ?s ?p ?o . 7 | FILTER(?p != owl:sameAs) 8 | OPTIONAL { ?s owl:sameAs ?s2 } 9 | OPTIONAL { ?o owl:sameAs ?o2 } 10 | BIND(IF(BOUND(?s2),?s2,?s) AS ?news) 11 | BIND(IF(BOUND(?o2),?o2,?o) AS ?newo) 12 | } 13 | -------------------------------------------------------------------------------- /sparql/reconcile.rq: -------------------------------------------------------------------------------- 1 | PREFIX schema: 2 | PREFIX lvont: 3 | PREFIX skos: 4 | PREFIX rdau: 5 | PREFIX pn: 6 | 7 | CONSTRUCT { 8 | ?s ?p ?o . 9 | ?s schema:inLanguage ?languageCode . 10 | ?s schema:about ?subjectUri, ?subjectString . 11 | ?s rdau:P60048 ?rdaCarrierType . 12 | ?s rdau:P60049 ?rdaContentType . 13 | ?s rdau:P60050 ?rdaMediaType . 14 | ?s ?p ?person . 15 | ?person schema:name ?personName . 16 | ?person a schema:Person . 17 | ?person schema:birthDate ?personBirthDate . 18 | ?person schema:deathDate ?personDeathDate . 19 | ?s ?p ?organization . 20 | ?organization schema:name ?organizationName . 21 | ?organization a schema:Organization . 22 | ?cw schema:isPartOf . 23 | ?seriesWithISSN schema:sameAs ?seriesISSNres . 24 | } WHERE { 25 | { 26 | ?s ?p ?o . 27 | FILTER(?p NOT IN (schema:inLanguage, schema:about, rdau:P60048, rdau:P60049, rdau:P60050)) 28 | FILTER NOT EXISTS { ?o a schema:Person } 29 | FILTER NOT EXISTS { ?s a schema:Person } 30 | FILTER NOT EXISTS { ?o a schema:Organization } 31 | FILTER NOT EXISTS { ?s a schema:Organization } 32 | } 33 | UNION 34 | { 35 | ?s schema:inLanguage ?languageVal . 36 | OPTIONAL { 37 | GRAPH ?lexvoGraph { 38 | ?langent lvont:iso6392BCode ?languageVal . 39 | ?langent lvont:iso639P1Code ?iso6391code . 40 | } 41 | } 42 | BIND(COALESCE(?iso6391code, ?languageVal) AS ?languageCode) 43 | } 44 | UNION 45 | { 46 | ?s schema:about ?subjectUri . 47 | FILTER(isIRI(?subjectUri)) 48 | FILTER NOT EXISTS { ?subjectUri a schema:Person } 49 | FILTER NOT EXISTS { ?subjectUri a schema:Organization } 50 | } 51 | UNION 52 | { 53 | ?s rdau:P60048 ?carrierCategoryValue . 54 | BIND(STRLANG(?carrierCategoryValue, 'fi') AS ?carrierCategoryValueFi) 55 | OPTIONAL { 56 | GRAPH ?rdaCarrierGraph { 57 | ?rdaCarrierType skos:prefLabel ?carrierCategoryValueFi . 58 | # make sure it's a genuine RDA Carrier concept, not e.g. YSA concept 59 | ?rdaCarrierType skos:inScheme . 60 | } 61 | } 62 | } 63 | UNION 64 | { 65 | ?s rdau:P60049 ?contentCategoryValue . 66 | BIND(STRLANG(?contentCategoryValue, 'fi') AS ?contentCategoryValueFi) 67 | OPTIONAL { 68 | GRAPH ?rdaContentGraph { 69 | ?rdaContentType skos:prefLabel ?contentCategoryValueFi . 70 | # make sure it's a genuine RDA Content concept, not e.g. YSA concept 71 | ?rdaContentType skos:inScheme . 72 | } 73 | } 74 | } 75 | UNION 76 | { 77 | ?s rdau:P60050 ?mediaCategoryValue . 78 | BIND(STRLANG(?mediaCategoryValue, 'fi') AS ?mediaCategoryValueFi) 79 | OPTIONAL { 80 | GRAPH ?rdaMediaGraph { 81 | ?rdaMediaType skos:prefLabel ?mediaCategoryValueFi . 82 | # make sure it's a genuine RDA Media concept, not e.g. YSA concept 83 | ?rdaMediaType skos:inScheme . 84 | } 85 | } 86 | 87 | } 88 | UNION 89 | { 90 | ?s ?p ?pers . 91 | ?pers a schema:Person . 92 | ?pers schema:name ?personName . 93 | OPTIONAL { 94 | ?pers schema:birthDate ?personBirthDate . 95 | } 96 | OPTIONAL { 97 | ?pers schema:deathDate ?personDeathDate . 98 | } 99 | OPTIONAL { 100 | ?pers schema:identifier ?personId . 101 | ?personId schema:propertyID "FIN11" . 102 | ?personId schema:value ?personIdValue . 103 | BIND(IRI(CONCAT(STR(pn:), ?personIdValue)) AS ?pnPerson) 104 | } 105 | BIND(COALESCE(?pnPerson, ?pers) AS ?person) 106 | } 107 | UNION 108 | { 109 | ?s ?p ?org . 110 | ?org a schema:Organization . 111 | ?org schema:name ?orgName . 112 | OPTIONAL { 113 | GRAPH ?cnGraph { 114 | ?cnOrganization skos:prefLabel ?orgName . 115 | } 116 | } 117 | OPTIONAL { 118 | GRAPH ?cnGraph { 119 | ?cnOrganization skos:altLabel ?orgName . 120 | ?cnOrganization skos:prefLabel ?orgPrefLabel . 121 | } 122 | } 123 | BIND(COALESCE(?cnOrganization,?org) AS ?organization) 124 | BIND(COALESCE(?orgPrefLabel, ?orgName) as ?organizationName) 125 | } 126 | UNION 127 | { 128 | ?cw a schema:CreativeWork 129 | } 130 | UNION 131 | { 132 | ?seriesWithISSN schema:issn ?seriesISSN . 133 | FILTER(REGEX(?seriesISSN, '^\\d{4}-\\d{4}$')) . 134 | BIND(IRI(CONCAT('https://issn.org/resource/issn/', ?seriesISSN)) AS ?seriesISSNres) 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /split-input/.gitignore: -------------------------------------------------------------------------------- 1 | *.alephseq 2 | *.md5 3 | 4 | -------------------------------------------------------------------------------- /split-input/README.md: -------------------------------------------------------------------------------- 1 | This directory contains batches of records sliced from the input files. 2 | It is only used as a temporary location; files will be either removed or 3 | moved to the `slices` directory during an update process. 4 | -------------------------------------------------------------------------------- /test/00_refdata.bats: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bats 2 | 3 | load test_helper 4 | 5 | setup () { 6 | global_setup 7 | make realclean 8 | } 9 | 10 | @test "Reference data: ISO639-2 to Finnish language name mapping" { 11 | make refdata/iso639-2-fi.csv 12 | [ -s refdata/iso639-2-fi.csv ] 13 | } 14 | 15 | @test "Reference data: ISO639-1 to ISO639-2 mapping" { 16 | make refdata/iso639-1-2-mapping.nt 17 | [ -s refdata/iso639-1-2-mapping.nt ] 18 | } 19 | 20 | @test "Reference data: Corporate names (normalized)" { 21 | make refdata/cn-labels.nt 22 | [ -s refdata/cn-labels.nt ] 23 | # make sure language tags have been stripped 24 | run grep -P '"@\w+ \.' refdata/cn-labels.nt 25 | [ $status -ne 0 ] 26 | } 27 | 28 | @test "Reference data: RDA Carrier types" { 29 | make refdata/RDACarrierType.nt 30 | [ -s refdata/RDACarrierType.nt ] 31 | } 32 | 33 | @test "Reference data: RDA Content types" { 34 | make refdata/RDAContentType.nt 35 | [ -s refdata/RDAContentType.nt ] 36 | } 37 | 38 | @test "Reference data: RDA Content types shouldn't have double slashes" { 39 | make refdata/RDAContentType.nt 40 | run grep 'RDAContentType//' refdata/RDAContentType.nt 41 | [ $status -ne 0 ] 42 | } 43 | 44 | @test "Reference data: RDA Media types" { 45 | make refdata/RDAMediaType.nt 46 | [ -s refdata/RDAMediaType.nt ] 47 | } 48 | 49 | @test "Reference data: 260c date value substitutions" { 50 | make refdata/subst-260c.csv 51 | [ -s refdata/subst-260c.csv ] 52 | } 53 | -------------------------------------------------------------------------------- /test/00_slice.bats: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bats 2 | 3 | load test_helper 4 | 5 | setup () { 6 | global_setup 7 | make realclean 8 | } 9 | 10 | @test "split into parts" { 11 | make slice 12 | [ -s slices/slice.md5 ] 13 | [ -s slices/slice-0040X-in.alephseq ] 14 | [ -s slices/slice-00411-in.alephseq ] 15 | } 16 | -------------------------------------------------------------------------------- /test/05_preprocess.bats: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bats 2 | 3 | load test_helper 4 | 5 | setup () { 6 | global_setup 7 | make slice 8 | } 9 | 10 | @test "Preprocess MARC: basic preprocessing" { 11 | rm -f slices/kotona-00097-preprocessed.alephseq 12 | make -j2 preprocess 13 | [ -s slices/kotona-00097-preprocessed.alephseq ] 14 | } 15 | 16 | @test "Preprocess MARC: contains YSA subject" { 17 | make slices/ajanlyhythistoria-00009-preprocessed.alephseq 18 | grep -q maailmankaikkeus slices/ajanlyhythistoria-00009-preprocessed.alephseq 19 | } 20 | 21 | @test "Preprocess MARC: drops subject without KEEP tag" { 22 | make slices/ajanlyhythistoria-00009-preprocessed.alephseq 23 | run grep kosmologia slices/ajanlyhythistoria-00009-preprocessed.alephseq 24 | [ $status -ne 0 ] 25 | } 26 | 27 | @test "Preprocess MARC: drop duplicate 130 fields" { 28 | make slices/sioninwirret-00061-preprocessed.alephseq 29 | run grep -c -F ' 130' slices/sioninwirret-00061-preprocessed.alephseq 30 | [ "$output" -eq "1" ] 31 | } 32 | 33 | @test "Preprocess MARC: drop \$9 subfields with multiple values" { 34 | make slices/aikuiskasvatus-00602-preprocessed.alephseq 35 | run grep '000114384,' slices/aikuiskasvatus-00602-preprocessed.alephseq 36 | [ $status -ne 0 ] 37 | } 38 | 39 | @test "Preprocess MARC: convert Fennica SID to 035 field" { 40 | make slices/kotona-00097-preprocessed.alephseq 41 | grep -F '000971472 035 L $$a(FI-FENNI)848382' slices/kotona-00097-preprocessed.alephseq 42 | } 43 | 44 | @test "Preprocess MARC: keep 880 fields which link to a field we want to keep" { 45 | make slices/hulluntaivaassa-00490-preprocessed.alephseq 46 | grep -F ' 880 L $$6260' slices/hulluntaivaassa-00490-preprocessed.alephseq 47 | } 48 | 49 | @test "Preprocess MARC: drop 880 fields which link to a field we want to drop" { 50 | make slices/hulluntaivaassa-00490-preprocessed.alephseq 51 | run grep -F ' 880 L $$6650' slices/hulluntaivaassa-00490-preprocessed.alephseq 52 | [ $status -ne 0 ] 53 | } 54 | -------------------------------------------------------------------------------- /test/10_marc_dist.bats: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bats 2 | 3 | load test_helper 4 | 5 | setup () { 6 | global_setup 7 | make slice 8 | } 9 | 10 | @test "MARC distribution: basic generation" { 11 | rm -f merged/hawking.mrcx 12 | make marcdist 13 | [ -s merged/hawking.mrcx ] 14 | } 15 | -------------------------------------------------------------------------------- /test/15_mrcx.bats: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bats 2 | 3 | load test_helper 4 | 5 | setup () { 6 | global_setup 7 | make slice 8 | } 9 | 10 | @test "MARCXML: basic conversion" { 11 | rm -f slices/kotona-00097.mrcx 12 | make -j2 mrcx 13 | [ -s slices/kotona-00097.mrcx ] 14 | } 15 | 16 | @test "MARCXML: skips prepublication records" { 17 | make slices/prepub-00566.mrcx 18 | run bash -c "xmllint --format slices/prepub-00566.mrcx | grep '001' | grep 005663958" 19 | [ "$status" -eq 1 ] 20 | } 21 | 22 | @test "MARCXML: adds missing 240\$a from 500 note" { 23 | make slices/origwork-00004.mrcx 24 | xmllint --format slices/origwork-00004.mrcx | grep -A 1 'tag="240"' | grep 'marc:subfield code="a">DAYLIGHT MUST COME' 25 | ! xmllint --format slices/origwork-00004.mrcx | grep -A 1 'tag="500"' | grep 'marc:subfield code="a">ENGL. ALKUTEOS: DAYLIGHT MUST COME' 26 | } 27 | 28 | @test "MARCXML: adds missing 240\$a from 500 note (with extra space)" { 29 | make slices/origwork-00271.mrcx 30 | xmllint --format slices/origwork-00271.mrcx | grep -A 1 'tag="240"' | grep 'marc:subfield code="a">Nationalökonimien i hovedtraek' 31 | ! xmllint --format slices/origwork-00271.mrcx | grep -A 1 'tag="500"' | grep 'marc:subfield code="a">Alkuteos : Nationalökonimien i hovedtraek.' 32 | } 33 | 34 | @test "MARCXML: adds missing 240\$l subfield" { 35 | make slices/ajanlyhythistoria-00009.mrcx 36 | xmllint --format slices/ajanlyhythistoria-00009.mrcx | grep -A 3 'tag="240"' | grep 'marc:subfield code="l"' 37 | } 38 | 39 | @test "MARCXML: removes \$2=rdacontent subfield from 336" { 40 | make slices/kotona-00720.mrcx 41 | ! xmllint --format slices/kotona-00720.mrcx | grep -A 4 'tag="336"' | grep 'marc:subfield code="2"' 42 | } 43 | 44 | @test "MARCXML: removes \$2=rdamedia subfield from 337" { 45 | make slices/kotona-00720.mrcx 46 | ! xmllint --format slices/kotona-00720.mrcx | grep -A 4 'tag="337"' | grep 'marc:subfield code="2"' 47 | } 48 | 49 | @test "MARCXML: removes birth/death years from living people" { 50 | make slices/kotona-00508.mrcx 51 | run bash -c "xmllint --format slices/kotona-00508.mrcx | grep -A 1 'Valtaoja, Esko' | grep 'marc:subfield code=.d.'" 52 | [ "$status" -ne 0 ] 53 | make slices/monot-00487.mrcx 54 | run bash -c "xmllint --format slices/monot-00487.mrcx | grep -A 1 'Harjanne, Maikki' | grep 'marc:subfield code=.d.'" 55 | [ "$status" -ne 0 ] 56 | make slices/origwork-00041.mrcx 57 | run bash -c "xmllint --format slices/origwork-00041.mrcx | grep -A 1 'Tanskanen, Raimo' | grep 'marc:subfield code=.d.'" 58 | [ "$status" -ne 0 ] 59 | } 60 | 61 | @test "MARCXML: removes trailing punctuation from names of people with removed birth/death years" { 62 | make slices/kotona-00508.mrcx 63 | run bash -c "xmllint --format slices/kotona-00508.mrcx | grep 'Valtaoja, Esko,'" 64 | [ "$status" -ne 0 ] 65 | make slices/monot-00487.mrcx 66 | run bash -c "xmllint --format slices/monot-00487.mrcx | grep 'Harjanne, Maikki,'" 67 | [ "$status" -ne 0 ] 68 | make slices/origwork-00041.mrcx 69 | run bash -c "xmllint --format slices/origwork-00041.mrcx | grep 'Tanskanen, Raimo,'" 70 | [ "$status" -ne 0 ] 71 | } 72 | 73 | @test "MARCXML: keeps birth/death years for dead people" { 74 | make slices/fanrik-manninen-00094.mrcx 75 | xmllint --format slices/fanrik-manninen-00094.mrcx | grep -A 1 'Runeberg, Johan Ludvig' | grep -q 'marc:subfield code="d"' 76 | xmllint --format slices/fanrik-manninen-00094.mrcx | grep -A 1 'Edelfelt, Albert' | grep -q 'marc:subfield code="d"' 77 | xmllint --format slices/fanrik-manninen-00094.mrcx | grep -A 1 'Manninen, Otto' | grep -q 'marc:subfield code="d"' 78 | xmllint --format slices/kollaakestaa-00003.mrcx | grep -A 1 'Palolampi, Erkki' | grep -q 'marc:subfield code="d"' 79 | } 80 | 81 | @test "MARCXML: keeps birth/death years for long dead people, even if death year is unknown" { 82 | make slices/punataudista-00084.mrcx 83 | xmllint --format slices/punataudista-00084.mrcx | grep -A 1 'Laitinen, Johannes' | grep -q 'marc:subfield code="d"' 84 | xmllint --format slices/kotkankasvisto-00641.mrcx | grep -A 1 'Ulvinen, Arvi' | grep -q 'marc:subfield code="d"' 85 | } 86 | 87 | @test "MARCXML: keeps birth/death years for long dead people, even if information is uncertain" { 88 | make slices/tvennekomedier-00034.mrcx 89 | xmllint --format slices/tvennekomedier-00034.mrcx | grep -A 1 'Chronander, Jacob Pettersson' | grep -q 'marc:subfield code="d"' 90 | } 91 | 92 | @test "MARCXML: avoid concatenating names of authors (may happen with older versions of Catmandu)" { 93 | make slices/part-uri-00683.mrcx 94 | xmllint --format slices/part-uri-00683.mrcx | grep -q -F 'Pelto-Huikko, Aino' 95 | ! xmllint --format slices/part-uri-00683.mrcx | grep 'Kaunisto, TuijaPelto-Huikko, Aino' 96 | } 97 | 98 | @test "MARCXML: removes 490 fields if a 830 field is present" { 99 | make slices/kotona-00508.mrcx 100 | run bash -c "xmllint --format slices/kotona-00508.mrcx | grep 'tag=\"490\"'" 101 | [ "$status" -ne 0 ] 102 | } 103 | 104 | @test "MARCXML: retains 490 fields if no 830 fields are present" { 105 | make slices/sjubroder-00450.mrcx 106 | xmllint --format slices/sjubroder-00450.mrcx | grep -q 'tag="490"' 107 | } 108 | 109 | @test "MARCXML: cleans up bad 260c values" { 110 | make slices/suoja-pirtti-00000.mrcx 111 | run bash -c "xmllint --format slices/suoja-pirtti-00000.mrcx | grep -A 3 'tag=.260.' | grep 'code=.c.' | grep 'Merkur'" 112 | [ "$status" -ne 0 ] 113 | } 114 | -------------------------------------------------------------------------------- /test/20_bibframe.bats: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bats 2 | 3 | load test_helper 4 | 5 | setup () { 6 | global_setup 7 | make slice 8 | } 9 | 10 | @test "BIBFRAME RDF: basic conversion" { 11 | rm -f slices/kotona-00097-bf2.rdf 12 | make -j2 rdf 13 | [ -s slices/kotona-00097-bf2.rdf ] 14 | } 15 | -------------------------------------------------------------------------------- /test/25_rewrite.bats: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bats 2 | 3 | load test_helper 4 | 5 | setup () { 6 | global_setup 7 | make slice 8 | } 9 | 10 | @test "Rewrite URIs: basic rewriting" { 11 | rm -f slices/kotona-00097-rewritten.nt 12 | make -j2 rewrite 13 | [ -s slices/kotona-00097-rewritten.nt ] 14 | } 15 | 16 | @test "Rewrite URIs: work URIs from the record itself" { 17 | make slices/raamattu-00000-rewritten.nt 18 | grep -q -F ' ' slices/raamattu-00000-rewritten.nt 19 | } 20 | 21 | @test "Rewrite URIs: instance URIs from the record itself" { 22 | make slices/raamattu-00000-rewritten.nt 23 | grep -q -F ' ' slices/raamattu-00000-rewritten.nt 24 | } 25 | 26 | @test "Rewrite URIs: rewriting person URIs" { 27 | make slices/origwork-00004-rewritten.nt 28 | make slices/origwork-00041-rewritten.nt 29 | # author uses 01 sequence number 30 | grep -q -F ' "Burgess, Alan' slices/origwork-00004-rewritten.nt 31 | # subject uses 02 sequence number 32 | grep -q -F ' "Roseveare, Helen' slices/origwork-00004-rewritten.nt 33 | # translator uses 03 sequence number 34 | grep -q -F ' "Aho, Oili' slices/origwork-00004-rewritten.nt 35 | # if there is no main author, then the first contributor (700) uses 01 sequence number 36 | grep -q -F ' "Krolick, Bettye' slices/origwork-00041-rewritten.nt 37 | } 38 | 39 | @test "Rewrite URIs: rewriting organization URIs" { 40 | make slices/forfattning-00006-rewritten.nt 41 | grep -q -F ' "Finland Justitieministeriet' slices/forfattning-00006-rewritten.nt 42 | } 43 | 44 | @test "Rewrite URIs: rewriting series URIs" { 45 | make slices/origwork-00041-rewritten.nt 46 | # 1st series statement uses 01 sequence number 47 | grep -q -F ' "Braille-neuvottelukunnan julkaisuja' slices/origwork-00041-rewritten.nt 48 | # 2nd series statement uses 02 sequence number 49 | grep -q -F ' "Braille-delegationens publikationer' slices/origwork-00041-rewritten.nt 50 | } 51 | 52 | @test "Rewrite URIs: quoting bad URLs" { 53 | make slices/bad-url-00639-rewritten.nt slices/bad-url-00642-rewritten.nt 54 | grep -q 'SYNTAX ERROR, quoting' slices/bad-url-00639-rewritten.log 55 | grep -q -F '' slices/bad-url-00639-rewritten.nt 56 | grep -q 'SYNTAX ERROR, quoting' slices/bad-url-00642-rewritten.log 57 | grep -q -F '' slices/bad-url-00642-rewritten.nt 58 | } 59 | 60 | @test "Rewrite URIs: skipping bad URLs that cannot be quoted" { 61 | make slices/bad-url-00733-rewritten.nt 62 | grep -q 'SYNTAX ERROR, skipping' slices/bad-url-00733-rewritten.log 63 | run grep 'http://ethesis.helsinki.fi/julkaisut/kay/fonet/vk/rautakoski/' slices/bad-url-00733-rewritten.nt 64 | [ $status -ne 0 ] 65 | } 66 | -------------------------------------------------------------------------------- /test/30_work_keys.bats: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bats 2 | 3 | load test_helper 4 | 5 | setup () { 6 | global_setup 7 | make slice 8 | } 9 | 10 | @test "Work keys: basic generation" { 11 | rm -f slices/kotona-00097-work-keys.nt 12 | make -j2 work-keys 13 | [ -s slices/kotona-00097-work-keys.nt ] 14 | } 15 | 16 | @test "Work keys: not a translation case" { 17 | make slices/punataudista-00084-work-keys.nt 18 | grep -q -F ' "punataudista ja poikimakuumeesta raavaskarjassa/laitinen, johannes"' slices/punataudista-00084-work-keys.nt 19 | # check that no additional keys were generated by accident 20 | count="$(wc -l "kotona maailmankaikkeudessa/valtaoja, esko"' slices/kotona-00097-work-keys.nt 29 | # translated work, key based on translated title 30 | grep -q -F ' "im universum zu hause eine entdeckungsreise/valtaoja, esko/uhlmann, peter"' slices/kotona-00097-work-keys.nt 31 | # translated work, key based on original title 32 | grep -q -F ' "kotona maailmankaikkeudessa saksa/valtaoja, esko/uhlmann, peter"' slices/kotona-00097-work-keys.nt 33 | # check that no additional keys were generated by accident 34 | count="$(wc -l "suomen ekumeeninen neuvosto toimintakertomus 2009 ekumeniska rådet i finland verksamhetsberättelse 2009/suomen ekumeeninen neuvosto"' slices/ekumeeninen-00585-work-keys.nt 42 | # check that no additional keys were generated by accident, apart from series keys (title and ISSN) 43 | count="$(wc -l "viemäreiden sisäpuoliset saneerausmenetelmät renovation of drains and sewers with nodig methods/muoviteollisuus (yhdistys)"' slices/part-uri-00683-work-keys.nt 51 | grep -q -F ' "viemäreiden sisäpuoliset saneerausmenetelmät renovation of drains and sewers with nodig methods/suomen standardisoimisliitto"' slices/part-uri-00683-work-keys.nt 52 | grep -q -F ' "viemäreiden sisäpuoliset saneerausmenetelmät renovation of drains and sewers with nodig methods/kaunisto, tuija"' slices/part-uri-00683-work-keys.nt 53 | grep -q -F ' "viemäreiden sisäpuoliset saneerausmenetelmät renovation of drains and sewers with nodig methods/pelto-huikko, aino"' slices/part-uri-00683-work-keys.nt 54 | # check that no additional keys were generated by accident, apart from series keys (title and ISSN) 55 | count="$(wc -l "raamattu"' slices/raamattu-00000-work-keys.nt 63 | # check that no additional keys were generated by accident 64 | count="$(wc -l "grundlagarna och statshushållningen kommittén för revision av grundlagarnas stadganden om statshushållning' slices/jakaja-00005-work-keys.nt 73 | [ $status -ne 0 ] 74 | } 75 | 76 | @test "Work keys: subtitle case" { 77 | make slices/ajanlyhythistoria-00009-work-keys.nt 78 | # subtitle should be part of work key 79 | grep -q -F ' "ajan lyhyt historia alkuräjähdyksestä mustiin aukkoihin/hawking, stephen/varteva, risto"' slices/ajanlyhythistoria-00009-work-keys.nt 80 | # title without subtitle should not be used for work keys 81 | run grep -F ' "ajan lyhyt historia/hawking, stephen"' slices/ajanlyhythistoria-00009-work-keys.nt 82 | [ $status -ne 0 ] 83 | } 84 | 85 | @test "Work keys: part number case" { 86 | make slices/titlepart-00077-work-keys.nt 87 | # part number should be part of work key 88 | grep -q -F ' "kootut lastut 1/aho, juhani"' slices/titlepart-00077-work-keys.nt 89 | } 90 | 91 | @test "Work keys: part title case" { 92 | make slices/titlepart-00077-work-keys.nt 93 | # part title should be part of work key 94 | grep -q -F ' "dekamerone neljäs päivä ja siihen kuuluvat 10 kertomusta/boccaccio, giovanni/elenius-pantzopoulos, anja"' slices/titlepart-00077-work-keys.nt 95 | } 96 | 97 | @test "Work keys: part number and title case, with author" { 98 | make slices/titlepart-00077-work-keys.nt 99 | # part number and title should be part of work key, in that order 100 | grep -q -F ' "kootut teokset 3 näytelmiä olviretki schleusingenissä leo ja liisa canzino selman juonet alma/kivi, aleksis"' slices/titlepart-00077-work-keys.nt 101 | } 102 | 103 | @test "Work keys: part number and title case, without author" { 104 | make slices/peruskartta-00078-work-keys.nt 105 | # part number and title should be part of work key, in that order 106 | grep -q -F ' "peruskartta 120000 2312 10 rintala"' slices/peruskartta-00078-work-keys.nt 107 | # check that the short key is not used 108 | run grep -q -F ' "peruskartta 120000"' slices/peruskartta-00078-work-keys.nt 109 | [ $status -ne 0 ] 110 | } 111 | 112 | @test "Work keys: work cannot be a bnode" { 113 | make slices/tukreidbol-00443-work-keys.nt 114 | run grep '^_:' slices/tukreidbol-00443-work-keys.nt 115 | [ $status -ne 0 ] 116 | } 117 | 118 | @test "Work keys: no recurring spaces" { 119 | make refdata/fanrik-manninen-work-keys.nt 120 | run grep ' ' refdata/fanrik-manninen-work-keys.nt 121 | [ $status -ne 0 ] 122 | } 123 | 124 | @test "Work keys: no trailing spaces in titles" { 125 | make refdata/fanrik-manninen-work-keys.nt 126 | run grep ' /' refdata/fanrik-manninen-work-keys.nt 127 | [ $status -ne 0 ] 128 | } 129 | 130 | @test "Work keys: no trailing commas" { 131 | make refdata/prepub-work-keys.nt 132 | run grep ',"' refdata/prepub-work-keys.nt 133 | [ $status -ne 0 ] 134 | } 135 | 136 | @test "Work keys: no birth/death years" { 137 | make refdata/sjubroder-work-keys.nt 138 | run grep '1834-1872' refdata/sjubroder-work-keys.nt 139 | [ $status -ne 0 ] 140 | } 141 | 142 | @test "Work keys: key for series based on title" { 143 | make refdata/hawking-work-keys.nt 144 | grep -q -F ' "wsoy pokkari"' refdata/hawking-work-keys.nt 145 | } 146 | 147 | @test "Work keys: key for series based on title doesn't contain space" { 148 | make refdata/fanrik-manninen-work-keys.nt 149 | grep -q -F ' "helppohintainen koulu ja kansankirjasto"' refdata/fanrik-manninen-work-keys.nt 150 | run grep -F ' "helppohintainen koulu ja kansankirjasto "' refdata/fanrik-manninen-work-keys.nt 151 | [ $status -ne 0 ] 152 | } 153 | 154 | @test "Work keys: key for series with contributor includes contributor" { 155 | make refdata/finlandsverige-work-keys.nt 156 | grep -q -F ' "henrik gabriel porthaninstituutti/julkaisuja"' refdata/finlandsverige-work-keys.nt 157 | run grep -F ' "julkaisuja"' refdata/finlandsverige-work-keys.nt 158 | [ $status -ne 0 ] 159 | } 160 | 161 | @test "Work keys: key for series based on ISSN" { 162 | make refdata/kotona-work-keys.nt 163 | grep -q -F ' "issn:0357-7937"' refdata/kotona-work-keys.nt 164 | } 165 | 166 | @test "Work keys: key for series based on ISSN is not empty" { 167 | make refdata/poliisi-work-keys.nt 168 | run grep -F ' "issn:"' refdata/poliisi-work-keys.nt 169 | [ $status -ne 0 ] 170 | } 171 | 172 | -------------------------------------------------------------------------------- /test/35_work_transformations.bats: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bats 2 | 3 | load test_helper 4 | 5 | setup () { 6 | global_setup 7 | make slice 8 | } 9 | 10 | @test "Work transformations: basic generation" { 11 | rm -f refdata/fanrik-manninen-work-transformations.nt 12 | make -j2 work-transformations 13 | [ -s refdata/fanrik-manninen-work-transformations.nt ] 14 | } 15 | 16 | @test "Work transformations: translations are consolidated to same original work" { 17 | make refdata/hawking-work-transformations.nt 18 | count="$(cut -d ' ' -f 3 refdata/hawking-work-transformations.nt | grep -c 'W00009584101>')" 19 | [ "$count" -eq 3 ] 20 | } 21 | 22 | @test "Work transformations: different translations to the same language are kept apart" { 23 | make refdata/sjubroder-work-transformations.nt 24 | diktonius="$(cut -d ' ' -f 3 refdata/sjubroder-work-transformations.nt | grep -c 'W00010308600>')" 25 | [ "$diktonius" -eq 8 ] 26 | lauren="$(cut -d ' ' -f 3 refdata/sjubroder-work-transformations.nt | grep -c 'W00052290400>')" 27 | [ "$lauren" -eq 4 ] 28 | } 29 | 30 | @test "Work transformations: prefer URIs for main works" { 31 | make refdata/kotona-work-transformations.nt 32 | grep -v -F ' ' refdata/kotona-work-transformations.nt 33 | grep -q -F ' ' refdata/kotona-work-transformations.nt 34 | } 35 | 36 | @test "Work transformations: prefer 240-generated URIs for works over 600-generated URIs" { 37 | make refdata/trauma-work-transformations.nt 38 | grep -v -F ' ' refdata/trauma-work-transformations.nt 39 | grep -q -F ' ' refdata/trauma-work-transformations.nt 40 | } 41 | -------------------------------------------------------------------------------- /test/45_reconcile.bats: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bats 2 | 3 | load test_helper 4 | 5 | setup () { 6 | global_setup 7 | make slice 8 | } 9 | 10 | # Disabled, because running this takes a very long time and causes Travis timeouts. 11 | # Instead, reconciliation for single files at a time is done by individual tests. 12 | # 13 | #@test "Reconcile: basic reconciliation" { 14 | # rm -f slices/kotona-00097-reconciled.nt 15 | # make -j2 reconcile 16 | # [ -s slices/kotona-00097-reconciled.nt ] 17 | #} 18 | 19 | @test "Reconcile: converting language codes to ISO 639-1" { 20 | make slices/ajattelemisenalku-00098-reconciled.nt 21 | grep -q -F ' "fi"' slices/ajattelemisenalku-00098-reconciled.nt 22 | run grep -F ' "fin"' slices/ajattelemisenalku-00098-reconciled.nt 23 | [ $status -ne 0 ] 24 | } 25 | 26 | @test "Reconcile: retaining work subjects" { 27 | make slices/trauma-00583-reconciled.nt 28 | count="$(grep -c ' ' slices/trauma-00583-reconciled.nt)" 29 | [ "$count" -eq 12 ] 30 | } 31 | 32 | @test "Reconcile: converting to YSA/YSO URIs, basic case" { 33 | make slices/ajattelemisenalku-00098-reconciled.nt 34 | # "myytit" -> ysa:Y97600 -> yso:p1248 35 | run grep -F ' "myytit"' slices/ajattelemisenalku-00098-reconciled.nt 36 | [ $status -ne 0 ] 37 | run grep -F ' ' slices/ajattelemisenalku-00098-reconciled.nt 38 | [ $status -ne 0 ] 39 | run grep -F ' ' slices/ajattelemisenalku-00098-reconciled.nt 40 | [ $status -ne 0 ] 41 | grep -q -F ' ' slices/ajattelemisenalku-00098-reconciled.nt 42 | } 43 | 44 | @test "Reconcile: converting to YSA/YSO URIs, place case" { 45 | make slices/etyk-00012-reconciled.nt 46 | # "Eurooppa" -> ysa:Y94111 -> yso:p94111 47 | run grep -F ' "Eurooppa"' slices/etyk-00012-reconciled.nt 48 | [ $status -ne 0 ] 49 | run grep -F ' ' slices/etyk-00012-reconciled.nt 50 | [ $status -ne 0 ] 51 | run grep -F ' ' slices/etyk-00012-reconciled.nt 52 | [ $status -ne 0 ] 53 | grep -q -F ' ' slices/etyk-00012-reconciled.nt 54 | } 55 | 56 | @test "Reconcile: converting to YSA/YSO URIs, coordinated case" { 57 | make slices/ajattelemisenalku-00098-reconciled.nt 58 | # "filosofia -- antiikki" -> ysa:Y95164 -> yso:p20343 59 | run grep -q -F ' "filosofia--antiikki"' slices/ajattelemisenalku-00098-reconciled.nt 60 | [ $status -ne 0 ] 61 | run grep -q -F ' "filosofia -- antiikki"' slices/ajattelemisenalku-00098-reconciled.nt 62 | [ $status -ne 0 ] 63 | run grep -q -F ' ' slices/ajattelemisenalku-00098-reconciled.nt 64 | [ $status -ne 0 ] 65 | run grep -q -F ' ' slices/ajattelemisenalku-00098-reconciled.nt 66 | [ $status -ne 0 ] 67 | grep -q -F ' ' slices/ajattelemisenalku-00098-reconciled.nt 68 | } 69 | 70 | @test "Reconcile: converting to YSA/YSO URIs, cyrillic case" { 71 | make slices/hulluntaivaassa-00490-reconciled.nt 72 | # "проза--пер. с финск."@ru-cyrl -> removed, as it was an accident that it got through the replication (via 880) 73 | run grep -q -F ' "проза--пер. с финск."@ru-cyrl' slices/hulluntaivaassa-00490-reconciled.nt 74 | [ $status -ne 0 ] 75 | # check that no other subjects are added by mistake 76 | run grep '' slices/hulluntaivaassa-00490-reconciled.nt 77 | [ $status -ne 0 ] 78 | } 79 | 80 | @test "Reconcile: converting to YSA URIs, same term as RDA Carrier case" { 81 | make slices/verkkoaineisto-00608-reconciled.nt 82 | run grep ' ' slices/verkkoaineisto-00608-reconciled.nt 83 | [ $status -ne 0 ] 84 | } 85 | 86 | @test "Reconcile: express authors with ID using PN" { 87 | make slices/kotkankasvisto-00641-reconciled.nt 88 | grep -q -F ' ' slices/kotkankasvisto-00641-reconciled.nt 89 | grep -q -F ' "Ulvinen, Arvi"' slices/kotkankasvisto-00641-reconciled.nt 90 | grep -q -F ' ' slices/kotkankasvisto-00641-reconciled.nt 91 | # check that no agent URIs derived from the bib record ID are left 92 | run grep -F "http://urn.fi/URN:NBN:fi:bib:me:P00641900301" slices/kotkankasvisto-00641-reconciled.nt 93 | [ $status -ne 0 ] 94 | } 95 | 96 | @test "Reconcile: preserve birth/death years for authors" { 97 | make slices/abckiria-00097-reconciled.nt 98 | grep -q -F ' "Agricola, Mikael"' slices/abckiria-00097-reconciled.nt 99 | grep -q -F ' "noin 1510"' slices/abckiria-00097-reconciled.nt 100 | grep -q -F ' "1557"' slices/abckiria-00097-reconciled.nt 101 | } 102 | 103 | @test "Reconcile: express contributors with ID using PN" { 104 | make slices/jatuli-00000-reconciled.nt 105 | grep -q -F ' ' slices/jatuli-00000-reconciled.nt 106 | grep -q -F ' "Keränen, Lauri"' slices/jatuli-00000-reconciled.nt 107 | grep -q -F ' ' slices/jatuli-00000-reconciled.nt 108 | # check that no agent URIs derived from the bib record ID are left 109 | run grep -F "http://urn.fi/URN:NBN:fi:bib:me:P00000675302" slices/jatuli-00000-reconciled.nt 110 | [ $status -ne 0 ] 111 | } 112 | 113 | @test "Reconcile: express person subjects with ID using PN" { 114 | make slices/ajattelemisenalku-00098-reconciled.nt 115 | grep -q -F ' ' slices/ajattelemisenalku-00098-reconciled.nt 116 | grep -q -F ' "Herakleitos"' slices/ajattelemisenalku-00098-reconciled.nt 117 | grep -q -F ' ' slices/ajattelemisenalku-00098-reconciled.nt 118 | # check that no agent URIs derived from the bib record ID are left 119 | run grep -F "http://urn.fi/URN:NBN:fi:bib:me:P00098125805" slices/ajattelemisenalku-00098-reconciled.nt 120 | [ $status -ne 0 ] 121 | } 122 | 123 | @test "Reconcile: express corporate subjects using CN" { 124 | make slices/evaluation-00590-reconciled.nt 125 | grep -q -F ' ' slices/evaluation-00590-reconciled.nt 126 | grep -q -F ' "Kansalliskirjasto"' slices/evaluation-00590-reconciled.nt 127 | grep -q -F ' ' slices/evaluation-00590-reconciled.nt 128 | # check that no agent URIs derived from the bib record ID are left 129 | run grep -F "http://urn.fi/URN:NBN:fi:bib:me:O00590886001" slices/evaluation-00590-reconciled.nt 130 | [ $status -ne 0 ] 131 | } 132 | 133 | @test "Reconcile: express publisher organizations using CN, preferred label case" { 134 | make slices/ekumeeninen-00585-reconciled.nt 135 | # "Suomen ekumeeninen neuvosto" -> cn:26756A 136 | grep -q -F ' ' slices/ekumeeninen-00585-reconciled.nt 137 | grep -q -F ' ' slices/ekumeeninen-00585-reconciled.nt 138 | # check that no blank nodes remain 139 | run grep -F ' _:' slices/ekumeeninen-00585-reconciled.nt 140 | [ $status -ne 0 ] 141 | run grep '^_:.* ' slices/ekumeeninen-00585-reconciled.nt 142 | [ $status -ne 0 ] 143 | } 144 | 145 | @test "Reconcile: express publisher organizations using CN, alternate label case" { 146 | make slices/verkkoaineisto-00608-reconciled.nt 147 | # "University of Jyväskylä" -> cn:8274A 148 | grep -q -F ' ' slices/verkkoaineisto-00608-reconciled.nt 149 | grep -q -F ' ' slices/verkkoaineisto-00608-reconciled.nt 150 | # check that the authorized label from CN is used as schema:name 151 | grep -q -F ' "Jyväskylän yliopisto"' slices/verkkoaineisto-00608-reconciled.nt 152 | # check that the non-authorized (alternate) label is not used in the output 153 | run grep -F ' "University of Jyväskylä"' slices/verkkoaineisto-00608-reconciled.nt 154 | [ $status -ne 0 ] 155 | # check that no blank nodes remain 156 | run grep -F ' _:' slices/verkkoaineisto-00608-reconciled.nt 157 | [ $status -ne 0 ] 158 | run grep '^_:.* ' slices/verkkoaineisto-00608-reconciled.nt 159 | [ $status -ne 0 ] 160 | } 161 | 162 | @test "Reconcile: retain publisher organizations that cannot be reconciled with CN" { 163 | make slices/punataudista-00084-reconciled.nt 164 | org="$(grep " \"Tekijä\"" slices/punataudista-00084-reconciled.nt | cut -d ' ' -f 1)" 165 | [ -n "$org" ] 166 | grep -q -F "$org " slices/punataudista-00084-reconciled.nt 167 | } 168 | 169 | @test "Reconcile: express subject organizations using CN" { 170 | make slices/etyk-00012-reconciled.nt 171 | grep -q -F ' ' slices/etyk-00012-reconciled.nt 172 | } 173 | 174 | @test "Reconcile: express subject meetings using CN" { 175 | make slices/etyk-00012-reconciled.nt 176 | grep -q -F ' ' slices/etyk-00012-reconciled.nt 177 | } 178 | 179 | @test "Reconcile: expressing RDA carrier type" { 180 | make slices/kotona-00720-reconciled.nt 181 | grep -q ' ' slices/kotona-00720-reconciled.nt 182 | run grep ' ' slices/kotona-00720-reconciled.nt 183 | [ $status -ne 0 ] 184 | } 185 | 186 | @test "Reconcile: expressing RDA content type" { 187 | make slices/kotona-00720-reconciled.nt 188 | grep -q ' ' slices/kotona-00720-reconciled.nt 189 | } 190 | 191 | @test "Reconcile: expressing RDA media type" { 192 | make slices/kotona-00720-reconciled.nt 193 | grep -q ' ' slices/kotona-00720-reconciled.nt 194 | } 195 | 196 | @test "Reconcile: works should be part of collection" { 197 | make slices/kotkankasvisto-00641-reconciled.nt 198 | grep -q ' ' slices/kotkankasvisto-00641-reconciled.nt 199 | grep -q ' ' slices/kotkankasvisto-00641-reconciled.nt 200 | } 201 | 202 | @test "Reconcile: instances should be part of collection" { 203 | make slices/kotkankasvisto-00641-reconciled.nt 204 | grep -q ' ' slices/kotkankasvisto-00641-reconciled.nt 205 | } 206 | 207 | @test "Reconcile: series with ISSNs should be linked to their issn.org identifier" { 208 | make slices/kotkankasvisto-00641-reconciled.nt 209 | grep -q ' ' slices/kotkankasvisto-00641-reconciled.nt 210 | } 211 | 212 | @test "Reconcile: invalid ISSNs should not be linked" { 213 | make slices/bad-issn-00004-reconciled.nt 214 | run grep ' "W00009584100/hawking, stephen"' slices/hawking-00009-agent-keys.nt 13 | } 14 | 15 | @test "Agent keys: contributor key" { 16 | make slices/hawking-00009-agent-keys.nt 17 | grep -q -F ' "W00009584100/sagan, carl"' slices/hawking-00009-agent-keys.nt 18 | } 19 | -------------------------------------------------------------------------------- /test/55_agent_transformations.bats: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bats 2 | 3 | load test_helper 4 | 5 | setup () { 6 | global_setup 7 | make slice 8 | } 9 | 10 | @test "Agent transformations: authors are merged" { 11 | make refdata/hawking-agent-transformations.nt 12 | count="$(cut -d ' ' -f 3 refdata/hawking-agent-transformations.nt | grep -c 'P00009584101>')" 13 | [ "$count" -eq 5 ] 14 | } 15 | 16 | @test "Agent transformations: contributors are merged" { 17 | make refdata/sjubroder-agent-transformations.nt 18 | count="$(cut -d ' ' -f 3 refdata/hawking-agent-transformations.nt | grep -c 'P00014685402>')" 19 | [ "$count" -eq 5 ] 20 | } 21 | 22 | @test "Agent transformations: prefer authorized persons" { 23 | make refdata/abckiria-agent-transformations.nt 24 | grep -q -F ' ' refdata/abckiria-agent-transformations.nt 25 | grep -q -F ' ' refdata/abckiria-agent-transformations.nt 26 | 27 | run grep -F ' ' refdata/abckiria-agent-transformations.nt 28 | [ "$status" -ne 0 ] 29 | run grep -F ' ' refdata/abckiria-agent-transformations.nt 30 | [ "$status" -ne 0 ] 31 | } 32 | -------------------------------------------------------------------------------- /test/60_merge.bats: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bats 2 | 3 | load test_helper 4 | 5 | setup () { 6 | global_setup 7 | make slice 8 | } 9 | 10 | # Disabled, because running this takes a very long time and causes Travis timeouts. 11 | # Instead, merging single files at a time is done by individual tests. 12 | # 13 | #@test "Merge works: basic merging" { 14 | # rm -f merged/hawking-merged.nt 15 | # make -j2 merge 16 | # [ -s merged/hawking-merged.nt ] 17 | #} 18 | 19 | @test "Merge works: translations are linked to same original work" { 20 | make merged/kotona-merged.nt 21 | count="$(grep translationOf merged/kotona-merged.nt | cut -d ' ' -f 3 | sort | uniq -c | awk '{ print $1 }')" 22 | [ "$count" -eq 2 ] 23 | } 24 | 25 | @test "Merge works: transitive handling of work keys" { 26 | make merged/fanrik-manninen-merged.nt 27 | count="$(grep workExample merged/fanrik-manninen-merged.nt | cut -d ' ' -f 1 | sort | uniq -c | wc -l)" 28 | [ "$count" -le 2 ] 29 | # Ideally the count would be just 1, but since we don't use person authorities yet, 30 | # there is one outlier in the set 31 | } 32 | 33 | @test "Merge works: series are merged based on title" { 34 | make merged/fanrik-manninen-merged.nt 35 | count="$(grep -c -F ' "Helppohintainen koulu- ja kansankirjasto"' merged/fanrik-manninen-merged.nt)" 36 | [ "$count" -eq 1 ] 37 | } 38 | 39 | @test "Merge works: series are merged based on ISSN" { 40 | make merged/kotona-merged.nt 41 | count="$(grep -F ' "0357-7937"' merged/kotona-merged.nt | cut -d ' ' -f 1 | sort | uniq | wc -l)" 42 | [ "$count" -eq 1 ] 43 | } 44 | 45 | @test "Merge works: works are part of a collection" { 46 | make merged/kotona-merged.nt 47 | grep ' ' merged/kotona-merged.nt 48 | grep ' "Fennica"' merged/kotona-merged.nt 49 | } 50 | 51 | @test "Merge works: instances are part of a collection" { 52 | make merged/kotona-merged.nt 53 | grep ' ' merged/kotona-merged.nt 54 | grep ' "Fennica"' merged/kotona-merged.nt 55 | } 56 | -------------------------------------------------------------------------------- /test/70_consolidate.bats: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bats 2 | 3 | load test_helper 4 | 5 | setup () { 6 | global_setup 7 | make slice 8 | } 9 | 10 | @test "Consolidate works: basic consolidation" { 11 | skip "not implemented, see https://github.com/NatLibFi/bib-rdf-pipeline/issues/3" 12 | rm -f output/hawking.nt 13 | rm -f output/hawking.hdt 14 | make -j2 consolidate 15 | [ -s output/hawking.nt ] 16 | [ -s output/hawking.hdt ] 17 | } 18 | -------------------------------------------------------------------------------- /test/Makefile: -------------------------------------------------------------------------------- 1 | PATH_PREFIX=../ 2 | include ../Makefile 3 | -------------------------------------------------------------------------------- /test/input/aikuiskasvatus.alephseq: -------------------------------------------------------------------------------- 1 | 006023537 FMT L BK 2 | 006023537 LDR L 00000cam^a2201861^i^4500 3 | 006023537 001 L 006023537 4 | 006023537 005 L 20170920092019.0 5 | 006023537 008 L 121109s2012^^^^fi^||||^^^^^^|00|^0|fin|^ 6 | 006023537 015 L $$afx1006800$$2skl 7 | 006023537 020 L $$a978-952-61-0804-9$$qnidottu 8 | 006023537 035 L $$a(FI-MELINDA)006023537 9 | 006023537 040 L $$aFI-NL 10 | 006023537 0410 L $$afin 11 | 006023537 042 L $$afinb 12 | 006023537 072 7 L $$a57$$2kkaa 13 | 006023537 080 L $$a374$$9FENNI 14 | 006023537 080 L $$a37 15 | 006023537 084 L $$a38.6$$2ykl$$9FENNI 16 | 006023537 084 L $$a37aik$$2uef 17 | 006023537 24500 L $$aAikuiskasvatuksen risteysasemalla :$$bjohdatus aikuiskasvatukseen /$$cJuha Suoranta, Juha Kauppila, Hilkka Rekola, Petri Salo ja Marjatta Vanhalakka-Ruoho. 18 | 006023537 260 L $$aJoensuu :$$bItä-Suomen yliopisto, Koulutus- ja kehittämispalvelu Aducate,$$c2012$$e(Tampere :$$fJuvenes Print - Tampereen Yliopistopaino) 19 | 006023537 300 L $$a247 s. :$$bkuvitettu, taulukkoja ;$$c25 cm 20 | 006023537 336 L $$ateksti$$btxt$$2rdacontent 21 | 006023537 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 22 | 006023537 338 L $$anide$$bnc$$2rdacarrier 23 | 006023537 4901 L $$aAducate reports and books,$$x1798-9116 ;$$vno 3/2012 24 | 006023537 500 L $$aJulkaistu aiemmin Joensuun yliopiston täydennyskoulutuskeskuksen kustantamana vuonna 2008 (2. korj. ja uud. p.).$$9FENNI$$9SAMK 25 | 006023537 500 L $$aLisäpainokset: [Lisäpainos] 2015. 26 | 006023537 5050 L $$a1 Aikuiskasvatus siltatieteenä -- 2 Aikuiskasvatuksen tieteellistyminen -- 3 Elämänkulku ja elinikäinen oppiminen -- 4 Ekskursio: elämänkulku ja aikuisuus - Daniel Levinson -- 5 Kulttuuris-yhteiskunnallista aikuisohjausta etsimässä -- 6 Sosiaaliset liikkeet ja aktiivinen kansalaisuus -- 7 Kansansivistystyö Suomessa ja muissa Pohjoismaissa -- 8 Aikuiskasvatuksen merkitys työelämän muutoksissa -- 9 Ekskursio: Työelämän problematiikkaan perehtynyt teoreetikko - Richard Sennett -- 10 Näkökulmia informaatioyhteiskuntaan ja aikuisten mediakasvatukseen -- 11 Aikuiskoulutus ja markkinoiden voima. 27 | 006023537 579 L $$aXLUETTELOITU$$bjosku 28 | 006023537 650 7 L $$aaikuiskasvatus$$2ysa$$9FENNI 29 | 006023537 650 7 L $$aaikuiskoulutus$$2ysa$$9FENNI 30 | 006023537 650 7 L $$aelinikäinen oppiminen$$2ysa$$9FENNI 31 | 006023537 650 7 L $$aelämänkaari$$2ysa$$9FENNI 32 | 006023537 650 7 L $$aohjaus$$2ysa$$9FENNI 33 | 006023537 650 7 L $$akansalaisyhteiskunta$$2ysa$$9FENNI 34 | 006023537 650 7 L $$aosallistuminen$$2ysa$$9FENNI 35 | 006023537 650 7 L $$asosiaaliset liikkeet$$2ysa$$9FENNI 36 | 006023537 650 7 L $$akansanvalistus$$2ysa$$9FENNI 37 | 006023537 650 7 L $$avapaa sivistystyö$$2ysa$$9FENNI 38 | 006023537 650 7 L $$atyöelämä$$2ysa$$9FENNI 39 | 006023537 650 7 L $$amuutos$$2ysa$$9FENNI 40 | 006023537 650 7 L $$atietoyhteiskunta$$2ysa$$9FENNI 41 | 006023537 650 7 L $$amediakasvatus$$2ysa$$9FENNI 42 | 006023537 650 7 L $$aaikuiset$$2ysa$$9FENNI 43 | 006023537 650 7 L $$aglobalisaatio$$2ysa$$9FENNI 44 | 006023537 650 7 L $$ahistoria$$2ysa$$9FENNI 45 | 006023537 650 7 L $$akoulutuspolitiikka$$2ysa 46 | 006023537 650 7 L $$aoppiminen$$xaikuiset$$2ysa$$9SAVON 47 | 006023537 650 7 L $$atyöelämä$$xmuutos$$2ysa$$9SAVON 48 | 006023537 650 7 L $$aoppiminen$$2ysa 49 | 006023537 650 7 L $$autbildningspolitik$$2allars 50 | 006023537 650 7 L $$ainlärning$$2allars 51 | 006023537 650 7 L $$avuxna$$2allars 52 | 006023537 650 7 L $$aarbetsliv$$2allars 53 | 006023537 650 7 L $$aförändring$$2allars 54 | 006023537 650 7 L $$avuxenpedagogik$$2allars 55 | 006023537 650 7 L $$avuxenutbildning$$2allars 56 | 006023537 650 7 L $$alivslångt lärande$$2allars 57 | 006023537 650 7 L $$adelatagande$$2allars 58 | 006023537 650 7 L $$afritt bildningsarbete$$2allars 59 | 006023537 650 7 L $$ahandledning$$2allars 60 | 006023537 650 7 L $$aglobalisering$$2allars 61 | 006023537 650 7 L $$aelämänkaari$$xohjaus$$2ysa 62 | 006023537 650 7 L $$amediakasvatus$$xaikuiset$$2ysa 63 | 006023537 650 7 L $$aglobalisaatio$$xkasvatus$$2ysa 64 | 006023537 650 7 L $$aaikuiskasvatus$$xhistoria$$2ysa 65 | 006023537 7001 L $$aSalo, Petri,$$d1964-$$0(FIN11)000114384$$9SAMK, SAVON 66 | 006023537 7001 L $$aSalo, Petri,$$d1964-$$ekirjoittaja.$$0(FIN11)000114384 67 | 006023537 7001 L $$aSuoranta, Juha,$$ekirjoittaja. 68 | 006023537 7001 L $$aKauppila, Juha,$$d1963-$$ekirjoittaja.$$0(FIN11)000111793 69 | 006023537 7001 L $$aRekola, Hilkka,$$ekirjoittaja. 70 | 006023537 7001 L $$aVanhalakka-Ruoho, Marjatta,$$d1950-$$ekirjoittaja.$$0(FIN11)000062142 71 | 006023537 830 0 L $$aAducate reports and books,$$x1798-9116 ;$$vno 3/2012. 72 | 006023537 901 L $$aMU20121109$$5FENNI 73 | 006023537 902 L $$ab$$5FENNI 74 | -------------------------------------------------------------------------------- /test/input/ajanlyhythistoria.alephseq: -------------------------------------------------------------------------------- 1 | 000095841 FMT L BK 2 | 000095841 LDR L 05070cam^a2201321zi^4500 3 | 000095841 001 L 000095841 4 | 000095841 005 L 20190703182640.0 5 | 000095841 008 L 940307s1994^^^^fi^|||||||||||||||||fin|| 6 | 000095841 015 L $$afx353859$$2skl 7 | 000095841 020 L $$a951-0-19440-9$$qsidottu 8 | 000095841 035 L $$a(FI-MELINDA)000095841 9 | 000095841 040 L $$aFI-NL 10 | 000095841 0411 L $$afin$$heng 11 | 000095841 042 L $$afinb 12 | 000095841 072 7 L $$a06$$2kkaa 13 | 000095841 080 L $$a524.8 14 | 000095841 080 L $$a529 15 | 000095841 080 L $$a530.1 16 | 000095841 080 L $$a52$$21974/fin/fennica$$9FENNI 17 | 000095841 080 L $$a53$$21974/fin/fennica$$9FENNI 18 | 000095841 080 L $$a521 19 | 000095841 084 L $$a52.2$$2ykl$$9FENNI 20 | 000095841 084 L $$a53.1$$2ykl 21 | 000095841 1001 L $$aHawking, Stephen.$$0(FIN11)000043470 22 | 000095841 24012 L $$aA brief history of time,$$lsuomi 23 | 000095841 24510 L $$aAjan lyhyt historia :$$balkuräjähdyksestä mustiin aukkoihin /$$cStephen W. Hawking ; alkusanat: Carl Sagan ; piirrokset: Ron Miller ; suomentanut Risto Varteva. 24 | 000095841 250 L $$a7. p. 25 | 000095841 260 L $$aPorvoo ;$$aHelsinki ;$$aJuva :$$bWSOY,$$c1994. 26 | 000095841 300 L $$aXI, 193 s. :$$bkuvitettu ;$$c23 cm 27 | 000095841 336 L $$ateksti$$btxt$$2rdacontent 28 | 000095841 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 29 | 000095841 338 L $$anide$$bnc$$2rdacarrier 30 | 000095841 500 L $$a6. p. 1990$$9FENNI 31 | 000095841 500 L $$aLisäpainokset: 2.-3. p. 1988. - 4.-5. p. 1989. - 6. p. 1990. 32 | 000095841 500 L $$aLisäpainokset: 8. p. 1999.$$9FENNI 33 | 000095841 500 L $$aPAINOS LOPPU. 34 | 000095841 60014 L $$aEinstein, Albert,$$d1879-1955. 35 | 000095841 60014 L $$aGalilei, Galileo. 36 | 000095841 60014 L $$aNewton, Isaac. 37 | 000095841 650 7 L $$ahistoria$$2yso/fin$$0http://www.yso.fi/onto/yso/p1780 38 | 000095841 650 7 L $$akosmologia$$2yso/fin$$0http://www.yso.fi/onto/yso/p7160 39 | 000095841 650 7 L $$amaailmankaikkeus$$2yso/fin$$0http://www.yso.fi/onto/yso/p4403$$9FENNI 40 | 000095841 650 7 L $$akvarkit$$2yso/fin$$0http://www.yso.fi/onto/yso/p19627$$9FENNI 41 | 000095841 650 7 L $$asuhteellisuusteoria$$2yso/fin$$0http://www.yso.fi/onto/yso/p9145$$9FENNI 42 | 000095841 650 7 L $$amustat aukot$$2yso/fin$$0http://www.yso.fi/onto/yso/p18360$$9FENNI 43 | 000095841 650 7 L $$aalkuräjähdys$$2yso/fin$$0http://www.yso.fi/onto/yso/p21501$$9FENNI 44 | 000095841 650 7 L $$aaika$$2yso/fin$$0http://www.yso.fi/onto/yso/p21034$$9FENNI 45 | 000095841 650 7 L $$amaailmankaikkeuden synty$$2yso/fin$$0http://www.yso.fi/onto/yso/p2872$$9FENNI 46 | 000095841 650 7 L $$ahistoria$$2yso/swe$$0http://www.yso.fi/onto/yso/p1780 47 | 000095841 650 7 L $$akosmologi$$2yso/swe$$0http://www.yso.fi/onto/yso/p7160 48 | 000095841 650 7 L $$auniversum$$2yso/swe$$0http://www.yso.fi/onto/yso/p4403 49 | 000095841 650 7 L $$akvarkar$$2yso/swe$$0http://www.yso.fi/onto/yso/p19627 50 | 000095841 650 7 L $$arelativitetsteori$$2yso/swe$$0http://www.yso.fi/onto/yso/p9145 51 | 000095841 650 7 L $$asvarta hål$$2yso/swe$$0http://www.yso.fi/onto/yso/p18360 52 | 000095841 650 7 L $$abig bang$$2yso/swe$$0http://www.yso.fi/onto/yso/p21501 53 | 000095841 650 7 L $$atid$$2yso/swe$$0http://www.yso.fi/onto/yso/p21034 54 | 000095841 650 7 L $$auniversums uppkomst$$2yso/swe$$0http://www.yso.fi/onto/yso/p2872 55 | 000095841 7001 L $$aSagan, Carl. 56 | 000095841 7001 L $$aVarteva, Risto,$$d1942-2004.$$0(FIN11)000062228 57 | 000095841 7400 L $$aAlkuräjähdyksestä mustiin aukkoihin. 58 | 000095841 SID L $$c458170$$bjykdo 59 | 000095841 SID L $$c339448$$boula 60 | 000095841 SID L $$c191141$$balli 61 | 000095841 SID L $$c211245$$balma 62 | 000095841 SID L $$c1164605$$bvaari 63 | 000095841 SID L $$c400737$$bvolte 64 | 000095841 SID L $$c156377$$bjuolu 65 | 000095841 SID L $$c10457$$blamk 66 | 000095841 SID L $$c353859$$bfenni 67 | 000095841 SID L $$c612634$$bhelka 68 | 000095841 SID L $$c113581$$btutca 69 | 000095841 SID L $$c(ANDL100008)359102$$bpiki 70 | 000095841 SID L $$c(ANDL100001)248568$$bvaski 71 | 000095841 SID L $$c(ANDL100007)277840$$beepos 72 | 000095841 CAT L $$aID-JUOLU$$b$$c20100608$$lFIN01$$h0403 73 | 000095841 CAT L $$aID-ALLI$$b$$c20120205$$lFIN01$$h2103 74 | 000095841 CAT L $$aID-ALLI$$b$$c20120206$$lFIN01$$h2300 75 | 000095841 CAT L $$aCONV-ISBD$$b$$c20120401$$lFIN01$$h2034 76 | 000095841 CAT L $$aLOAD-LAMK$$b$$c20130406$$lFIN01$$h0532 77 | 000095841 CAT L $$aLOAD-FIX$$b$$c20140116$$lFIN01$$h2330 78 | 000095841 CAT L $$aLOAD-FIX$$b$$c20140123$$lFIN01$$h1943 79 | 000095841 CAT L $$aLOAD-FIX$$b$$c20140129$$lFIN01$$h2352 80 | 000095841 CAT L $$aLOAD-KVP$$b$$c20140221$$lFIN01$$h2356 81 | 000095841 CAT L $$aLOAD-HELKA$$b$$c20140510$$lFIN01$$h0245 82 | 000095841 CAT L $$aLOAD-FIX$$b30$$c20141222$$lFIN01$$h1032 83 | 000095841 CAT L $$aFENNI4004$$b30$$c20150129$$lFIN01$$h1100 84 | 000095841 CAT L $$aLOAD-PIKI$$b$$c20150614$$lFIN01$$h0057 85 | 000095841 CAT L $$aLOAD-FIX$$b30$$c20150620$$lFIN01$$h0244 86 | 000095841 CAT L $$aLOAD-FIX$$b30$$c20151222$$lFIN01$$h2140 87 | 000095841 CAT L $$aCONV-RDA$$b$$c20160319$$lFIN01$$h0813 88 | 000095841 CAT L $$aLOAD-VASKI$$b$$c20170118$$lFIN01$$h0024 89 | 000095841 CAT L $$aLOAD-ALINK$$b30$$c20170818$$lFIN01$$h0720 90 | 000095841 CAT L $$aLOAD-ALINK$$b30$$c20170829$$lFIN01$$h2002 91 | 000095841 CAT L $$aLOAD-FIX$$b30$$c20180104$$lFIN01$$h1940 92 | 000095841 CAT L $$aLOAD-EEPOS$$b20$$c20181023$$lFIN01$$h0515 93 | 000095841 CAT L $$aLOAD-FIX$$b30$$c20181212$$lFIN01$$h1434 94 | 000095841 CAT L $$aLOAD-YSO$$b00$$c20190703$$lFIN01$$h1826 95 | 000095841 CAT L $$aLOAD-YSO$$b00$$c20190705$$lFIN01$$h1331 96 | 000095841 CAT L $$aLOAD-ID$$b00$$c20190712$$lFIN01$$h1839 97 | 000095841 9001 L $$aHawking, Stephen W.$$yHawking, Stephen 98 | 000095841 901 L $$aMM20150129 (100, 900)$$5FENNI 99 | 000095841 902 L $$ab$$5FENNI 100 | 000095841 908 L $$axxk 101 | 000095841 LOW L $$aALLI 102 | 000095841 LOW L $$aALMA 103 | 000095841 LOW L $$aFENNI 104 | 000095841 LOW L $$aHELKA 105 | 000095841 LOW L $$aJUOLU 106 | 000095841 LOW L $$aJYKDO 107 | 000095841 LOW L $$aOULA 108 | 000095841 LOW L $$aPIKI 109 | 000095841 LOW L $$aTUTCA 110 | 000095841 LOW L $$aVAARI 111 | 000095841 LOW L $$aVOLTE 112 | 000095841 LOW L $$aVASKI 113 | 000095841 LOW L $$aEEPOS 114 | 000095841 LOW L $$aFIKKA 115 | -------------------------------------------------------------------------------- /test/input/ajanvirrassa.alephseq: -------------------------------------------------------------------------------- 1 | 000047635 FMT L BK 2 | 000047635 LDR L 00000cam^a2200769zi^4500 3 | 000047635 001 L 000047635 4 | 000047635 005 L 20180104184609.0 5 | 000047635 008 L 870714s1987^^^^fi^|||||||||||||||||fin|| 6 | 000047635 015 L $$afx137258$$2skl 7 | 000047635 020 L $$a951-99811-0-1$$qsidottu 8 | 000047635 035 L $$a(FI-MELINDA)000047635 9 | 000047635 040 L $$aFI-NL 10 | 000047635 0410 L $$afin 11 | 000047635 042 L $$afinb 12 | 000047635 080 L $$a336.7 13 | 000047635 080 L $$a39$$21974/fin/fennica$$9FENNI 14 | 000047635 080 L $$a336.722$$x(091)$$21974/fin/fennica$$9FENNI 15 | 000047635 084 L $$a81.3$$2ykl$$9FENNI 16 | 000047635 084 L $$a36.2209$$2ykl 17 | 000047635 1001 L $$aSeilo, Anna-Liisa. 18 | 000047635 24510 L $$aAjan virrassa :$$bParkanon säästöpankki 1887-1987 /$$c[teksti: Anna-Liisa Seilo] ; [kuv.: Säästöpankin arkisto ja R. S. Ala-Karvia]. 19 | 000047635 260 L $$a[Parkano] :$$bParkanon säästöpankki,$$c1987$$f(Parkanon kirjap.) 20 | 000047635 300 L $$a[2], 88 s. :$$bkuvitettu ;$$c22 x 24 cm 21 | 000047635 336 L $$ateksti$$btxt$$2rdacontent 22 | 000047635 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 23 | 000047635 338 L $$anide$$bnc$$2rdacarrier 24 | 000047635 61024 L $$aParkanon säästöpankki.$$0(FIN11)000003429 25 | 000047635 650 7 L $$asäästöpankit$$zParkano$$2ysa 26 | 000047635 650 7 L $$akaskut$$zParkano$$2ysa 27 | 000047635 650 7 L $$ahistoriikit$$2ysa 28 | 000047635 650 7 L $$akaskut$$2ysa$$9FENNI 29 | 000047635 650 7 L $$asäästöpankit$$2ysa$$9FENNI 30 | 000047635 650 7 L $$ahistoriikit$$xpankit$$zParkano$$2ysa 31 | 000047635 650 7 L $$asparbanker$$zParkano$$2allars 32 | 000047635 651 7 L $$aParkano$$2allars 33 | 000047635 651 7 L $$aParkano$$2ysa$$9FENNI 34 | 000047635 7102 L $$aParkanon säästöpankki.$$0(FIN11)000003429 35 | 000047635 903 L $$aa$$5FENNI 36 | 000047635 908 L $$afin 37 | -------------------------------------------------------------------------------- /test/input/ajattelemisenalku.alephseq: -------------------------------------------------------------------------------- 1 | 000981258 FMT L BK 2 | 000981258 LDR L 06619cam^a2201585^i^4500 3 | 000981258 001 L 000981258 4 | 000981258 005 L 20190703190504.0 5 | 000981258 008 L 080716s2008^^^^fi^|||||||||||||||||fin|^ 6 | 000981258 015 L $$afx888913$$2skl 7 | 000981258 020 L $$a978-952-5764-00-0$$qnidottu 8 | 000981258 0248 L $$aA1290525 9 | 000981258 035 L $$a(FI-MELINDA)000981258 10 | 000981258 040 L $$aFI-NL 11 | 000981258 0410 L $$afin 12 | 000981258 042 L $$afinb 13 | 000981258 072 7 L $$a02$$2kkaa 14 | 000981258 080 L $$a1$$21974/fin/fennica$$9FENNI 15 | 000981258 084 L $$a11.1$$2ykl$$9FENNI 16 | 000981258 084 L $$a11.1 17 | 000981258 1001 L $$aVarto, Juha,$$d1949-$$0(FIN11)000079982 18 | 000981258 24510 L $$aAjattelemisen alku ja loppu :$$bkreikkalaista eetosta etsimässä /$$cJuha Varto. 19 | 000981258 260 L $$a[Lahti] :$$bElan Vital,$$c2008$$e(Lahti :$$fLahti Kopio) 20 | 000981258 300 L $$a186 s. :$$bkuvitettu ;$$c21 cm 21 | 000981258 336 L $$ateksti$$btxt$$2rdacontent 22 | 000981258 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 23 | 000981258 338 L $$anide$$bnc$$2rdacarrier 24 | 000981258 530 L $$aMyös elektronisena julkaisuna (ISBN 978-952-5764-01-7, PDF).$$9FENNI 25 | 000981258 579 L $$aXLUETTELOITU$$bdiak 26 | 000981258 579 L $$aXLUETTELOITU$$bhelka 27 | 000981258 60004 L $$aHomeros.$$9FENNI 28 | 000981258 60004 L $$aParmenides.$$9FENNI 29 | 000981258 60014 L $$aZenon,$$cElealainen.$$0(FIN11)000108251$$9FENNI 30 | 000981258 60004 L $$aHerakleitos.$$0(FIN11)000043960$$9FENNI 31 | 000981258 60004 L $$aEmpedokles.$$9FENNI 32 | 000981258 60004 L $$aDemokritos.$$0(FIN11)000124924$$9FENNI 33 | 000981258 60004 L $$aDemokrito. 34 | 000981258 650 7 L $$aantiikin filosofia$$2yso/fin$$0http://www.yso.fi/onto/yso/p20343$$9FENNI 35 | 000981258 650 7 L $$aajattelu$$2yso/fin$$0http://www.yso.fi/onto/yso/p6007$$9FENNI 36 | 000981258 650 7 L $$amaailmankuva$$2yso/fin$$0http://www.yso.fi/onto/yso/p219$$9FENNI 37 | 000981258 650 7 L $$amyytit$$2yso/fin$$0http://www.yso.fi/onto/yso/p1248$$9FENNI 38 | 000981258 650 7 L $$aesisokraattinen filosofia$$2yso/fin$$0http://www.yso.fi/onto/yso/p17715$$9FENNI 39 | 000981258 650 7 L $$akosmologia$$2yso/fin$$0http://www.yso.fi/onto/yso/p7160$$9FENNI 40 | 000981258 650 7 L $$ametafysiikka$$2yso/fin$$0http://www.yso.fi/onto/yso/p1059$$9FENNI 41 | 000981258 650 7 L $$aparadoksit$$2yso/fin$$0http://www.yso.fi/onto/yso/p13482$$9FENNI 42 | 000981258 650 7 L $$aluonnonfilosofia$$2yso/fin$$0http://www.yso.fi/onto/yso/p14119$$9FENNI 43 | 000981258 650 7 L $$akirjallisuus$$2yso/fin$$0http://www.yso.fi/onto/yso/p8113$$9FENNI 44 | 000981258 650 7 L $$aantiikki$$2yso/fin$$0http://www.yso.fi/onto/yso/p3973$$9FENNI 45 | 000981258 650 7 L $$aeepokset$$2yso/fin$$0http://www.yso.fi/onto/yso/p6478$$9FENNI 46 | 000981258 650 7 L $$afilosofit$$2yso/fin$$0http://www.yso.fi/onto/yso/p19124$$9FENNI 47 | 000981258 650 7 L $$afilosofia$$2yso/fin$$0http://www.yso.fi/onto/yso/p1056 48 | 000981258 650 7 L $$aantikens filosofi$$2yso/swe$$0http://www.yso.fi/onto/yso/p20343 49 | 000981258 650 7 L $$atänkande$$2yso/swe$$0http://www.yso.fi/onto/yso/p6007 50 | 000981258 650 7 L $$avärldsbild$$2yso/swe$$0http://www.yso.fi/onto/yso/p219 51 | 000981258 650 7 L $$amyter$$2yso/swe$$0http://www.yso.fi/onto/yso/p1248 52 | 000981258 650 7 L $$aförsokratisk filosofi$$2yso/swe$$0http://www.yso.fi/onto/yso/p17715 53 | 000981258 650 7 L $$akosmologi$$2yso/swe$$0http://www.yso.fi/onto/yso/p7160 54 | 000981258 650 7 L $$ametafysik$$2yso/swe$$0http://www.yso.fi/onto/yso/p1059 55 | 000981258 650 7 L $$aparadoxer$$2yso/swe$$0http://www.yso.fi/onto/yso/p13482 56 | 000981258 650 7 L $$anaturfilosofi$$2yso/swe$$0http://www.yso.fi/onto/yso/p14119 57 | 000981258 650 7 L $$alitteratur$$2yso/swe$$0http://www.yso.fi/onto/yso/p8113 58 | 000981258 650 7 L $$aantiken$$2yso/swe$$0http://www.yso.fi/onto/yso/p3973 59 | 000981258 650 7 L $$aepos$$2yso/swe$$0http://www.yso.fi/onto/yso/p6478 60 | 000981258 650 7 L $$afilosofer$$2yso/swe$$0http://www.yso.fi/onto/yso/p19124 61 | 000981258 650 7 L $$afilosofi$$2yso/swe$$0http://www.yso.fi/onto/yso/p1056 62 | 000981258 651 7 L $$aKreikka$$2yso/fin$$0http://www.yso.fi/onto/yso/p105037$$9FENNI 63 | -------------------------------------------------------------------------------- /test/input/bad-issn.alephseq: -------------------------------------------------------------------------------- 1 | 000045005 FMT L BK 2 | 000045005 LDR L 00000cam^a2200865zi^4500 3 | 000045005 001 L 000045005 4 | 000045005 005 L 20180104182752.0 5 | 000045005 008 L 880210s1987^^^^fi^|||||||||||||||||fin|| 6 | 000045005 015 L $$afx116583$$2skl 7 | 000045005 020 L $$a951-9039-28-7$$qnidottu 8 | 000045005 035 L $$a(FI-MELINDA)000045005 9 | 000045005 040 L $$aFI-NL 10 | 000045005 0410 L $$afin 11 | 000045005 042 L $$afinb 12 | 000045005 080 L $$a221 13 | 000045005 080 L $$a224 14 | 000045005 080 L $$a22$$21974/fin/fennica$$9FENNI 15 | 000045005 084 L $$a22.1 16 | 000045005 1001 L $$aPeltola, Olavi,$$d1929-$$0(FIN11)000055073 17 | 000045005 24010 L $$aRaamattu.$$pVanha testamentti 18 | 000045005 24510 L $$aOpiskelemme Vanhaa testamenttia.$$n2,$$pProfeettojen kirjat /$$cOlavi Peltola. 19 | 000045005 260 L $$aKauniainen :$$bSuomen raamattuopiston kustannus,$$c1987$$e(Kurikka :$$fKurikka-paino) 20 | 000045005 300 L $$a179 s. ;$$c21 cm 21 | 000045005 336 L $$ateksti$$btxt$$2rdacontent 22 | 000045005 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 23 | 000045005 338 L $$anide$$bnc$$2rdacarrier 24 | 000045005 4901 L $$aRaamattukirjasto,$$x0781-6 618 ;$$v6 25 | 000045005 63004 L $$aRaamattu. 26 | 000045005 63004 L $$aRaamattu.$$pVanha testamentti.$$9FENNI. 27 | 000045005 6300 L $$aRaamattu.$$sVanha testamentti. 28 | 000045005 650 7 L $$aRaamattu$$xVanha testamentti$$2ysa 29 | 000045005 650 7 L $$aRaamattu$$2ysa 30 | 000045005 650 7 L $$aoppikirjat$$2ysa 31 | 000045005 650 7 L $$aprofeetat$$2ysa 32 | 000045005 650 7 L $$araamatuntulkinta$$2ysa$$9FENNI 33 | 000045005 650 7 L $$aBibeln$$xGamla testamentet$$2allars 34 | 000045005 650 7 L $$aRaamattu 35 | 000045005 650 7 L $$aVanha testamentti 36 | 000045005 650 7 L $$aeksegetiikka 37 | 000045005 7400 L $$aProfeettojan kirjat 38 | 000045005 830 0 L $$aRaamattukirjasto,$$x0781-6 618 ;$$v6. 39 | 000046711 FMT L BK 40 | 000046711 LDR L 00000cam^a2200985zi^4500 41 | 000046711 001 L 000046711 42 | 000046711 005 L 20180516120834.0 43 | 000046711 008 L 850716s1984^^^^fi^|||||||||||1|||||eng|| 44 | 000046711 015 L $$afx131106$$2skl 45 | 000046711 020 L $$a951-95852-2-2$$qnidottu 46 | 000046711 035 L $$a(FI-MELINDA)000046711 47 | 000046711 040 L $$aFI-NL 48 | 000046711 0410 L $$aeng 49 | 000046711 042 L $$afinb 50 | 000046711 080 L $$a66$$21974/fin/fennica$$9FENNI 51 | 000046711 080 L $$a061.3 52 | 000046711 080 L $$a159.934 53 | 000046711 080 L $$a541.694 54 | 000046711 080 L $$a543.4 55 | 000046711 080 L $$a543.8/543.9 56 | 000046711 080 L $$a543.9 57 | 000046711 080 L $$a663 58 | 000046711 080 L $$a663.1 59 | 000046711 080 L $$a663.15 60 | 000046711 080 L $$a663.15:543.8/543.9 61 | 000046711 080 L $$a663.2 62 | 000046711 080 L $$a663.3 63 | 000046711 080 L $$a663.4 64 | 000046711 080 L $$a663.5 65 | 000046711 080 L $$a663.5:541.694:665.57 66 | 000046711 080 L $$a665.57 67 | 000046711 080 L $$a665.57:663.5:541.694 68 | 000046711 1112 L $$aAlko Symposium on Flavour Research of Alcoholic Beverages$$d(1984 :$$cHelsinki). 69 | 000046711 24510 L $$aFlavour research of alcoholic beverages :$$binstrumental and sensory analysis : proceedings of the Alko Symposium June 13-15, 1984, Helsinki, Finland /$$ced. by Lalli Nykänen and Pekka Lehtonen. 70 | 000046711 260 L $$aHki :$$bFoundation for Biotechnical and Industrial Fermentation Research :$$bAkateeminen kirjakauppa, distr.,$$c1984$$f(Kauppakirjap.) 71 | 000046711 300 L $$a335 s. :$$bkuvitettu ;$$c25 cm 72 | 000046711 336 L $$ateksti$$btxt$$2rdacontent 73 | 000046711 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 74 | 000046711 338 L $$anide$$bnc$$2rdacarrier 75 | 000046711 4901 L $$aFoundation for Biotechnical and Industrial Fermentation Research,$$x0780-6655 4v vol. 3 76 | 000046711 650 7 L $$aalkoholiteollisuus$$2eks 77 | 000046711 7001 L $$aNykänen, Lalli,$$d1928-$$0(FIN11)000053931 78 | 000046711 7001 L $$aLehtonen, Pekka,$$d1952-$$0(FIN11)000075319 79 | 000046711 7102 L $$aBiotekniikan ja käymisteollisuuden tutkimussäätiö.$$0(FIN11)000000287 80 | 000046711 830 0 L $$aFoundation for Biotechnical and Industrial Fermentation Research,$$x0780-6655 4v vol. 3. 81 | 000046711 9102 L $$aFoundation for Biotechnical and Industrial Fermentation Research$$yBiotekniikan ja käymisteollisuuden tutkimussäätiö 82 | -------------------------------------------------------------------------------- /test/input/bad-url.alephseq: -------------------------------------------------------------------------------- 1 | 007334701 FMT L BK 2 | 007334701 LDR L 00000cam^a2201129^i^4500 3 | 007334701 001 L 007334701 4 | 007334701 005 L 20160812140140.0 5 | 007334701 008 L 150817s2005^^^^fi^||||||m^^^|||||||fin|^ 6 | 007334701 040 L $$aFI-NL 7 | 007334701 1001 L $$aRautakoski, Pirkko. 8 | 007334701 24510 L $$aVaikeasti afaattisten henkilöiden ja heidän läheistensä kommunikointitaitojen kuntoutuminen :$$bseurantatutkimus /$$cPirkko Rautakoski. 9 | 007334701 260 L $$a[Helsinki] :$$bHelsingin yliopisto,$$c2005$$f(Hakapaino) 10 | 007334701 300 L $$a168 s. :$$bkuvitettu ;$$c25 cm 11 | 007334701 85640 L $$uhttp://ethesis.helsinki.fi/julkaisut/kay/fonet/vk/rautakoski/ |q PDF 12 | 006396594 FMT L BK 13 | 006396594 LDR L ^^^^^cam^a2200649^i^4500 14 | 006396594 001 L 006396594 15 | 006396594 005 L 20160108083424.0 16 | 006396594 008 L 130304s2012^^^^fi^||||^^^^^^f00|^0|eng|^ 17 | 006396594 040 L $$aFI-NL 18 | 006396594 1001 L $$aSepúlveda, Magdalena. 19 | 006396594 24514 L $$aThe human rights approach to social protection /$$cMagdalena Sepúlveda and Carly Nyst. 20 | 006396594 260 L $$a[Helsinki] :$$bMinistry for Foreign Affairs,$$c2012$$e([Oulu] :$$fErweko) 21 | 006396594 300 L $$a68 s. ;$$c25 cm 22 | 006396594 85641 L $$uhttp://formin.finland.fi/public/download.aspx?ID=96845&GUID={E3C53F54-3FA3-4A33-BA1E-C55F5CA16703}$$yLinkki verkkoaineistoon 23 | 006429795 FMT L SE 24 | 006429795 LDR L ^^^^^cas^a2200505^i^4500 25 | 006429795 001 L 006429795 26 | 006429795 005 L 20160110000525.0 27 | 006429795 008 L 131016c20049999fi^tr^p|o^^^^|0^^^b0fin|^ 28 | 006429795 040 L $$aFI-NL 29 | 006429795 222 0 L $$aUlla 30 | 006429795 24500 L $$aUlla /$$cSuomen verkkoneuleyhdistys ry. 31 | 006429795 24613 L $$aVerkkoneulelehti Ulla 32 | 006429795 260 L $$a[Kustannuspaikka tuntematon] :$$bSuomen verkkoneuleyhdistys,$$c2004- 33 | 006429795 85640 L $$uhttp:\\www.ullaneule.net/$$yLinkki verkkoaineistoon 34 | -------------------------------------------------------------------------------- /test/input/ekumeeninen.alephseq: -------------------------------------------------------------------------------- 1 | 005853197 FMT L BK 2 | 005853197 LDR L ^^^^^cam^a2200541^i^4500 3 | 005853197 001 L 005853197 4 | 005853197 005 L 20160103094013.0 5 | 005853197 008 L 110208s2010^^^^fi^||||^^^^^^|00|^0|fin|^ 6 | 005853197 015 L $$afx962115$$2skl 7 | 005853197 020 L $$a978-952-9529-48-3$$qnidottu 8 | 005853197 035 L $$a(FI-MELINDA)005853197 9 | 005853197 040 L $$aFI-NL 10 | 005853197 0410 L $$afin$$aswe 11 | 005853197 042 L $$afinb 12 | 005853197 072 7 L $$a53$$2kka 13 | 005853197 080 L $$a26$$9FENNI 14 | 005853197 1102 L $$aSuomen ekumeeninen neuvosto. 15 | 005853197 24510 L $$aSuomen ekumeeninen neuvosto :$$btoimintakertomus 2009 = Ekumeniska rådet i Finland : verksamhetsberättelse 2009. 16 | 005853197 24631 L $$aEkumeniska rådet i Finland :$$bverksamhetsberättelse 2009 17 | 005853197 24630 L $$aToimintakertomus 2009 18 | 005853197 24631 L $$aVerksamhetsberättelse 2009 19 | 005853197 260 L $$a[Helsinki] :$$bSuomen ekumeeninen neuvosto,$$c2010$$e(Saarijärvi :$$fSaarijärven Offset) 20 | 005853197 300 L $$a68 s. :$$bkuvitettu ;$$c30 cm 21 | 005853197 336 L $$ateksti$$btxt$$2rdacontent 22 | 005853197 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 23 | 005853197 338 L $$anide$$bnc$$2rdacarrier 24 | 005853197 4901 L $$aSuomen ekumeenisen neuvoston julkaisuja,$$x0784-350X ;$$v91 25 | 005853197 61024 L $$aSuomen ekumeeninen neuvosto. 26 | 005853197 61024 L $$aEkumeniska rådet i Finland. 27 | 005853197 650 7 L $$atoimintakertomukset$$2ysa 28 | 005853197 650 7 L $$averksamhetsberättelser$$2allars 29 | 005853197 830 0 L $$aSuomen ekumeenisen neuvoston julkaisuja,$$x0784-350X ;$$v91. 30 | 005853197 901 L $$aMU20110414$$5FENNI 31 | 005853197 9102 L $$aEkumeniska rådet i Finland$$ySuomen ekumeeninen neuvosto 32 | -------------------------------------------------------------------------------- /test/input/etyk.alephseq: -------------------------------------------------------------------------------- 1 | 000125405 FMT L BK 2 | 000125405 LDR L 05102cam^a2201249^i^4500 3 | 000125405 001 L 000125405 4 | 000125405 005 L 20190703191157.0 5 | 000125405 008 L 960430s1996^^^^fi^|||||||||||||||||fin|^ 6 | 000125405 015 L $$afx485129$$2skl 7 | 000125405 020 L $$a951-25-0800-1$$qnidottu 8 | 000125405 035 L $$a(FI-MELINDA)000125405 9 | 000125405 040 L $$aFI-NL 10 | 000125405 0410 L $$afin 11 | 000125405 042 L $$afinb 12 | 000125405 080 L $$a327.5$$x(4) 13 | 000125405 080 L $$a355/359 14 | 000125405 080 L $$a327$$x(4) 15 | 000125405 080 L $$a327$$21974/fin/fennica$$9FENNI 16 | 000125405 084 L $$a32.5$$2ykl$$9FENNI 17 | 000125405 1001 L $$aSoininen, Mika. 18 | 000125405 24510 L $$aEtykin konfliktinesto ja kriisinhallinta /$$cMika Soininen. 19 | 000125405 260 L $$aHelsinki :$$bMaanpuolustuskorkeakoulu,$$c1996. 20 | 000125405 300 L $$a110, [11] s. :$$bkuvitettu ;$$c25 cm 21 | 000125405 336 L $$ateksti$$btxt$$2rdacontent 22 | 000125405 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 23 | 000125405 338 L $$anide$$bnc$$2rdacarrier 24 | 000125405 4901 L $$aJulkaisusarja / Maanpuolustuskorkeakoulu, strategian laitos. 1, Strategian tutkimuksia,$$x1236-4959 ;$$vn:o 6 25 | 000125405 61024 L $$aEuroopan turvallisuus- ja yhteistyöjärjestö.$$0(FIN11)000014039$$9FENNI 26 | 000125405 61024 L $$aEuroopan turvallisuus- ja yhteistyökonferenssi. 27 | 000125405 61124 L $$aEuroopan turvallisuus- ja yhteistyökonferenssi.$$9FENNI 28 | 000125405 650 7 L $$akriisinhallinta$$2yso/fin$$0http://www.yso.fi/onto/yso/p504$$9FENNI 29 | 000125405 650 7 L $$ahallinta$$2yso/fin$$0http://www.yso.fi/onto/yso/p506$$9FENNI 30 | 000125405 650 7 L $$akonfliktit$$2yso/fin$$0http://www.yso.fi/onto/yso/p7946$$9FENNI 31 | 000125405 650 7 L $$akansainvälinen yhteistyö$$2yso/fin$$0http://www.yso.fi/onto/yso/p1730$$9FENNI 32 | 000125405 650 7 L $$arauhanturvaaminen$$2yso/fin$$0http://www.yso.fi/onto/yso/p507$$9FENNI 33 | 000125405 650 7 L $$akriisit$$2yso/fin$$0http://www.yso.fi/onto/yso/p6173 34 | 000125405 650 7 L $$aturvallisuuspolitiikka$$2yso/fin$$0http://www.yso.fi/onto/yso/p9566$$9FENNI 35 | 000125405 650 7 L $$apoliittiset kriisit$$2yso/fin$$0http://www.yso.fi/onto/yso/p9900$$9FENNI 36 | 000125405 650 7 L $$aulkopolitiikka$$2yso/fin$$0http://www.yso.fi/onto/yso/p12405 37 | 000125405 650 7 L $$akrishantering$$2yso/swe$$0http://www.yso.fi/onto/yso/p504 38 | 000125405 650 7 L $$astyre$$2yso/swe$$0http://www.yso.fi/onto/yso/p506 39 | 000125405 650 7 L $$akonflikter$$2yso/swe$$0http://www.yso.fi/onto/yso/p7946 40 | 000125405 650 7 L $$ainternationellt samarbete$$2yso/swe$$0http://www.yso.fi/onto/yso/p1730 41 | 000125405 650 7 L $$afredsbevarande$$2yso/swe$$0http://www.yso.fi/onto/yso/p507 42 | 000125405 650 7 L $$akriser$$2yso/swe$$0http://www.yso.fi/onto/yso/p6173 43 | 000125405 650 7 L $$asäkerhetspolitik$$2yso/swe$$0http://www.yso.fi/onto/yso/p9566 44 | 000125405 650 7 L $$apolitiska kriser$$2yso/swe$$0http://www.yso.fi/onto/yso/p9900 45 | 000125405 650 7 L $$autrikespolitik$$2yso/swe$$0http://www.yso.fi/onto/yso/p12405 46 | 000125405 650 7 L $$aEuroopan turvallisuus- ja yhteistyökokous$$xETYK$$2eks 47 | 000125405 650 7 L $$akriisinhallinta$$2eks 48 | 000125405 651 7 L $$aSuomi$$2yso/fin$$0http://www.yso.fi/onto/yso/p94426 49 | 000125405 651 7 L $$aEurooppa$$2yso/fin$$0http://www.yso.fi/onto/yso/p94111$$9FENNI 50 | 000125405 651 7 L $$aFinland$$2yso/swe$$0http://www.yso.fi/onto/yso/p94426 51 | 000125405 651 7 L $$aEuropa$$2yso/swe$$0http://www.yso.fi/onto/yso/p94111 52 | 000125405 653 0 L $$aForeign policy 53 | 000125405 653 0 L $$aETYK 54 | 000125405 653 7 L $$asäkerhetspolitik$$aEuropa$$2allars 55 | 000125405 830 0 L $$aJulkaisusarja / Maanpuolustuskorkeakoulu, strategian laitos.$$n1,$$pStrategian tutkimuksia,$$x1236-4959 ;$$vn:o 6. 56 | -------------------------------------------------------------------------------- /test/input/evaluation.alephseq: -------------------------------------------------------------------------------- 1 | 005908860 FMT L BK 2 | 005908860 LDR L 00000cam^a2200721^i^4500 3 | 005908860 001 L 005908860 4 | 005908860 005 L 20170924124740.0 5 | 005908860 008 L 110503s2011^^^^fi^||||^^^^^^f00|^0|eng|^ 6 | 005908860 015 L $$afx969041$$2skl 7 | 005908860 020 L $$a978-952-263-029-2$$qnidottu 8 | 005908860 035 L $$a(FI-MELINDA)005908860 9 | 005908860 040 L $$aFI-NL 10 | 005908860 0410 L $$aeng 11 | 005908860 042 L $$afinb 12 | 005908860 072 7 L $$a81$$2kkaa 13 | 005908860 080 L $$a02$$9FENNI 14 | 005908860 24500 L $$aInternational evaluation of the National Library of Finland :$$breport of the evaluation panel. 15 | 005908860 260 L $$aHelsinki :$$bMinistry of Education and Culture, Department for Education and Science Policy ;$$aKuopio :$$bKopijyvä [jakaja],$$c2011. 16 | 005908860 300 L $$a35 s. :$$bkuvitettu ;$$c27 cm 17 | 005908860 336 L $$ateksti$$btxt$$2rdacontent 18 | 005908860 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 19 | 005908860 338 L $$anide$$bnc$$2rdacarrier 20 | 005908860 4901 L $$aReports of the Ministry of Education and Culture, Finland,$$x1799-0343 ;$$v2011:14 21 | 005908860 530 L $$aJulkaistu myös verkkoaineistona ISBN 978-952-263-030-8 (PDF)$$9FENNI 22 | 005908860 61024 L $$aKansalliskirjasto.$$0(FIN11)000034269$$9FENNI 23 | 005908860 650 7 L $$akirjastot$$2ysa$$9FENNI 24 | 005908860 650 7 L $$akansalliskirjastot$$2ysa$$9FENNI 25 | 005908860 650 7 L $$akansainvälinen arviointi$$2ysa$$9FENNI 26 | 005908860 650 7 L $$aarviointi$$2ysa$$9FENNI 27 | 005908860 650 7 L $$akehittäminen$$2ysa$$9FENNI 28 | 005908860 650 7 L $$abibliotek$$2allars 29 | 005908860 650 7 L $$anationalbibliotek$$2allars 30 | 005908860 650 7 L $$ainternationell utvärdering$$2allars 31 | 005908860 650 7 L $$autvärdering$$2allars 32 | 005908860 650 7 L $$autveckling$$2allars 33 | 005908860 7101 L $$aSuomi.$$bOpetus- ja kulttuuriministeriö.$$bKoulutus- ja tiedepolitiikan osasto.$$0(FIN11)000034526 34 | 005908860 830 0 L $$aOpetus- ja kulttuuriministeriön julkaisuja,$$x1799-0343 ;$$v2011:14. 35 | 005908860 85641 L $$uhttp://www.minedu.fi/export/sites/default/OPM/Julkaisut/2011/liitteet/okm14.pdf?lang=fi$$yLinkki verkkoaineistoon 36 | 005908860 901 L $$aMM20111020$$5FENNI 37 | 005908860 901 L $$aMU20110704$$5FENNI 38 | 005908860 904 L $$ap$$5FENNI 39 | 005908860 9101 L $$aMinistry of Education and Culture.$$bDepartment for Education and Science Policy$$yOpetus- ja kulttuuriministeriö. Koulutus- ja tiedepolitiikan osasto 40 | -------------------------------------------------------------------------------- /test/input/finlandsverige.alephseq: -------------------------------------------------------------------------------- 1 | 011538637 FMT L BK 2 | 011538637 LDR L 00000cam^a2200505zi^4500 3 | 011538637 001 L 011538637 4 | 011538637 005 L 20171022164125.0 5 | 011538637 008 L 171022s1974^^^^fi^|||||||||||||||||swe|| 6 | 011538637 015 L $$af753639$$2skl 7 | 011538637 035 L $$z(FI-MELINDA)000473004 8 | 011538637 035 L $$z(FI-MELINDA)001912489 9 | 011538637 035 L $$z(FI-MELINDA)005199601 10 | 011538637 035 L $$z(FI-MELINDA)007339087 11 | 011538637 040 L $$aFI-NL 12 | 011538637 0410 L $$aswe 13 | 011538637 042 L $$afinb 14 | 011538637 072 7 L $$a52$$2kkaa 15 | 011538637 080 L $$a378$$9FENNI 16 | 011538637 080 L $$a930$$9FENNI 17 | 011538637 080 L $$a940$$9FENNI 18 | 011538637 1001 L $$aKlinge, Matti,$$d1936-$$0(FIN11)000047833 19 | 011538637 24510 L $$aOm Finland och Sverige på 1800-talet :$$bnågra jämförelser på idétraditionens och den akademiska organisationens område /$$cMatti Klinge. 20 | 011538637 260 L $$aTurku,$$c1974. 21 | 011538637 260 L $$aÅbo :$$bHenrik Gabriel Porthan instituutti,$$c[1974]$$e( [Ekenäs] :$$fEkenäs tr.) 22 | 011538637 300 L $$a[2], 18 s. 23 | 011538637 336 L $$ateksti$$btxt$$2rdacontent 24 | 011538637 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 25 | 011538637 338 L $$anide$$bnc$$2rdacarrier 26 | 011538637 4901 L $$aJulkaisuja / Henrik Gabriel Porthan-instituutti,$$x0356-8326 ;$$v4 27 | 011538637 500 L $$aFöredrag hållet vid Henrik Gabriel Porthan-institutets symposium "Den kulturella miljön i Finland under 1800-talet sedd ur europeisk synvinkel", den 2-3 december 1972. 28 | 011538637 500 L $$aSärtr. ur Historisk tidskrift för Finland 3/74.$$9FENNI 29 | 011538637 500 L $$aSärtr. ur Historisk tidskrift för Finland ; 1974:3. 30 | 011538637 583 L $$aAUTOMATICALLY MERGED FROM (FI-MELINDA)000473004 + (FI-MELINDA)007339087$$c2017-10-22T16:41:23+03:00$$5MELINDA 31 | 011538637 583 L $$aMERGED FROM (FI-MELINDA)005199601 + (FI-MELINDA)001912489$$c2015-08-18T06:38:08+03:00$$5MELINDA 32 | 011538637 650 7 L $$ahistoria$$zRuotsi$$2ysa 33 | 011538637 650 7 L $$ahistoria$$zSuomi$$2ysa 34 | 011538637 8102 L $$aHenrik Gabriel Porthan-instituutti.$$tJulkaisuja ;$$v4. 35 | 011538637 830 0 L $$aJulkaisuja / Henrik Gabriel Porthan-instituutti,$$x0356-8326 ;$$v4. 36 | -------------------------------------------------------------------------------- /test/input/forfattning.alephseq: -------------------------------------------------------------------------------- 1 | 000061544 FMT L SE 2 | 000061544 LDR L ^^^^^cas^a2201297^i^4500 3 | 000061544 001 L 000061544 4 | 000061544 005 L 20160203120458.0 5 | 000061544 007 L ta 6 | 000061544 008 L 891213d19172014fi^z|^^|^l^^^o0^^^b0swe|^ 7 | 000061544 015 L $$afx181973$$2skl 8 | 000061544 0220 L $$a0787-3182$$l0787-3182$$2a 9 | 000061544 035 L $$a(FI-MELINDA)000061544 10 | 000061544 040 L $$aFI-NL 11 | 000061544 0410 L $$aswe 12 | 000061544 042 L $$afinb 13 | 000061544 080 L $$a34$$9FENNI 14 | 000061544 080 L $$a34$$x(094) 15 | 000061544 080 L $$a34$$x(480) 16 | 000061544 084 L $$aHo:2.3$$2z 17 | 000061544 2101 L $$aFinl. författn.saml. 18 | 000061544 222 0 L $$aFinlands författningssamling 19 | 000061544 24500 L $$aFinlands författningssamling. 20 | 000061544 260 L $$aHfors :$$b[Staten publikationsbyrå, distr.],$$c1917-2014. 21 | 000061544 300 L $$c8:o 22 | 000061544 336 L $$ateksti$$btxt$$2rdacontent 23 | 000061544 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 24 | 000061544 338 L $$anide$$bnc$$2rdacarrier 25 | 000061544 3620 L $$a1917, nr 1-2014, nr 1459. 26 | 000061544 500 L $$aInnehållande nr... jämte kronologiskt och alfabetiskt register.$$9FENNI 27 | 000061544 530 L $$aJulkaistu myös verkkoaineistona 1995-$$9FENNI 28 | 000061544 550 L $$aKustantaja myöhemmin: Edita. - Julkaisija myöhemmin: Justitieministeriet.$$9FENNI 29 | 000061544 650 7 L $$asäädöskokoelmat$$zSuomi$$2ysa 30 | 000061544 650 7 L $$aasetukset$$xlait$$2ysa 31 | 000061544 650 7 L $$asäädökset$$zSuomi$$2ysa 32 | 000061544 650 7 L $$aasetukset$$zSuomi$$2ysa 33 | 000061544 650 7 L $$alainsäädäntö$$zSuomi$$2ysa 34 | 000061544 650 7 L $$akausijulkaisut$$xasetukset$$2ysa 35 | 000061544 650 7 L $$asäädökset$$2ysa 36 | 000061544 650 7 L $$asäädöskokoelmat$$2ysa 37 | 000061544 650 7 L $$aförfattningssamlingar$$zFinland$$2allars 38 | 000061544 650 7 L $$aförfattningar$$zFinland$$2allars 39 | 000061544 650 7 L $$aförordningar$$zFinland$$2allars 40 | 000061544 650 7 L $$alagstiftning$$zFinland$$2allars 41 | 000061544 650 7 L $$aförfattningar$$2allars 42 | 000061544 650 7 L $$aförfattningssamlingar$$2allars 43 | 000061544 653 L $$aasetuskokoelmat 44 | 000061544 655 7 L $$avirallisjulkaisut$$2ysa$$9FENNI 45 | 000061544 655 7 L $$avuosikirjat$$2ysa 46 | 000061544 7101 L $$aFinland$$bJustitieministeriet. 47 | 000061544 7101 L $$aSuomi.$$bOikeusministeriö. 48 | 000061544 720 L $$aJustitieministeriet 49 | 000061544 7650 L $$tSuomen asetuskokoelma$$x0787-314X$$9FENNI 50 | 000061544 7650 L $$tSuomen säädöskokoelma$$x1237-3419$$9FENNI 51 | 000061544 7700 L $$tFinlands forfattningssamlings fördragsserie. Europeiska ekonomiska samarbetsområdet$$9FENNI 52 | 000061544 7700 L $$tFinlands författningssamling. Budgetserien$$9FENNI 53 | 000061544 7700 L $$tFinlands författningssamlings fördragsserie. Överenskommelser med främmande makter$$x0787-3239$$9FENNI 54 | 000061544 7760 L $$tElektronisk Finlands författningssamling$$x1456-9663$$9FENNI 55 | 000061544 77608 L $$iVerkkoaineisto:$$tFinlands författningssamling$$x1456-9663 56 | 000061544 78000 L $$tStorfurstendömet Finlands författningssamling$$9FENNI 57 | 000061544 935 L $$a201601c$$5FENNI 58 | -------------------------------------------------------------------------------- /test/input/holding.alephseq: -------------------------------------------------------------------------------- 1 | 000017960 LDR L 01608nam^a2200409^i^4500 2 | 000017960 001 L 000017960 3 | 000017960 005 L 20130117170845.0 4 | 000017960 008 L 130117s19961996hu ro b 000 0 ger 1 5 | 000017960 009 L 000000325219 6 | 000017960 020 L $$a963-8155-57-4 (kötött) : $$cár nélkül 7 | 000017960 040 L $$aOSZK$$bhun$$cOSZK$$dMNM 8 | 000017960 041 L $$ager$$hhun 9 | 000017960 072 1 L $$aF 10 | 000017960 072 1 L $$aY 11 | 000017960 080 L $$a342.519.8 (439) 12 | 000017960 080 L $$a739.2 13 | 000017960 080 L $$a943.9 14 | 000017960 100 L $$aTóth Endre. $$d1944- 15 | 000017960 240 1 L $$aA magyar Szent Korona$$lnémet 16 | 000017960 24514 L $$aDie Heilige Krone von Ungarn :$$bKönige und Krönungen / $$c[Text] Endre Tóth ; [Aufnahmen] Károly Szelényi ; [Übers. Eva und Gyula Berta] ; [hrsg. von dem Ungarischen Nationalmuseum, ... und dem F. Szelényi Haus] 17 | 000017960 2600 L $$aBudapest ; $$aVeszprém :$$bUng. Nationalmus. ; $$bF. Szelényi Haus,$$ccop. 1996$$eVeszprém$$fProspektus GM 18 | 000017960 300 L $$a71 p. :$$bill., főként színes ;$$c31 cm 19 | 000017960 500 L $$aRajz. Nagy Katalin, Pintér Katalin, Vári Ágnes 20 | 000017960 504 L $$aBibliogr.: p. 71. 21 | 000017960 700 L $$aSzelényi Károly. $$d1943- 22 | 000017960 700 L $$aNagy Katalin$$4[ill.] 23 | 000017960 700 L $$aPintér Katalin$$4[ill.] 24 | 000017960 700 L $$aVári Ágnes$$4[ill.] 25 | 000017960 700 L $$aBerta Éva$$4[ford.] 26 | 000017960 700 L $$aBerta Gyula$$4[ford.] 27 | 000017960 710 L $$aMagyar Nemzeti Múzeum$$c(Budapest)$$4(közread.) 28 | 000017960 710 L $$aF. Szelényi Ház BT$$c(Veszprém)$$4(közread.) 29 | 000017960 850 L $$aB662$$9FENNI 30 | 000017960 852 L $$aB662$$bB662$$t17961$$t5678591$$pR 487/1999$$jRQ 14964 31 | 000017960 852 L $$aB662$$bB662$$t17962$$t5678592$$pR 790/1999$$jROG 1,2 32 | 000017960 876 L $$pR 487/1999$$a17961$$a5678591$$t17961$$t5678591 33 | 000017960 876 L $$pR 790/1999$$a17962$$a5678592$$t17962$$t5678592 34 | -------------------------------------------------------------------------------- /test/input/hulluntaivaassa.alephseq: -------------------------------------------------------------------------------- 1 | 004903276 FMT L BK 2 | 004903276 LDR L 04141cam^a22010094i^4500 3 | 004903276 001 L 004903276 4 | 004903276 005 L 20190703222202.0 5 | 004903276 008 L 050926s2005^^^^ru^|||||||||||||||f|rus|| 6 | 004903276 020 L $$a5-354-00928-6$$qnidottu 7 | 004903276 0243 L $$a9785354009282 8 | 004903276 035 L $$a(FI-MELINDA)004903276 9 | 004903276 040 L $$aFI-NL 10 | 004903276 0411 L $$arus$$hfin 11 | 004903276 042 L $$afinb 12 | 004903276 066 L $$c(N)Q 13 | 004903276 080 L $$a894.541$$x-3$$21974/fin/fennica$$9FENNI 14 | 004903276 080 L $$a882$$x-3$$x=03.945.41 15 | 004903276 1001 L $$aKonkka, Anita,$$d1941-$$0(FIN11)000048148 16 | 004903276 24010 L $$aHullun taivaassa : kertomus 17 | 004903276 24510 L $$6880-01$$aV sumasšedših nebesah :$$bpovest' /$$cAnita Konkka ; perevod s finskogo T. Džafarovoj-Viitala. 18 | 004903276 260 L $$6880-02$$aMoskva :$$bURSS,$$c2005. 19 | 004903276 300 L $$a117 s. 20 | 004903276 336 L $$ateksti$$btxt$$2rdacontent 21 | 004903276 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 22 | 004903276 338 L $$anide$$bnc$$2rdacarrier 23 | 004903276 650 7 L $$asuomen kieli$$2yso/fin$$0http://www.yso.fi/onto/yso/p8856 24 | 004903276 650 7 L $$avenäjänkielinen kirjallisuus$$2yso/fin$$0http://www.yso.fi/onto/yso/p16335 25 | 004903276 650 7 L $$akaunokirjallisuus$$2yso/fin$$0http://www.yso.fi/onto/yso/p4 26 | 004903276 650 7 L $$arakkauskertomukset$$2yso/fin$$0http://www.yso.fi/onto/yso/p19257 27 | 004903276 650 7 L $$akertomukset$$2yso/fin$$0http://www.yso.fi/onto/yso/p24639 28 | 004903276 650 7 L $$afinska$$2yso/swe$$0http://www.yso.fi/onto/yso/p8856 29 | 004903276 650 7 L $$arysk litteratur$$2yso/swe$$0http://www.yso.fi/onto/yso/p16335 30 | 004903276 650 7 L $$askönlitteratur$$2yso/swe$$0http://www.yso.fi/onto/yso/p4 31 | 004903276 650 7 L $$akärleksberättelser$$2yso/swe$$0http://www.yso.fi/onto/yso/p19257 32 | 004903276 650 7 L $$aberättelser$$2yso/swe$$0http://www.yso.fi/onto/yso/p24639 33 | 004903276 653 L $$6880-03$$aproza$$aper. s finsk. 34 | 004903276 653 L $$aromaanit$$asuomen kieli$$avenäjänkielinen käännös 35 | 004903276 653 0 L $$avenäjänkielinen käännös 36 | 004903276 655 7 L $$aromaanit$$2slm/fin$$0http://urn.fi/URN:NBN:fi:au:slm:s518 37 | 004903276 655 7 L $$akaunokirjallisuus$$2slm/fin$$0http://urn.fi/URN:NBN:fi:au:slm:s975 38 | 004903276 655 7 L $$akäännökset$$2slm/fin$$0http://urn.fi/URN:NBN:fi:au:slm:s1044 39 | 004903276 655 7 L $$aromaner$$2slm/swe$$0http://urn.fi/URN:NBN:fi:au:slm:s518 40 | 004903276 655 7 L $$askönlitteratur$$2slm/swe$$0http://urn.fi/URN:NBN:fi:au:slm:s975 41 | 004903276 655 7 L $$aöversättningar$$2slm/swe$$0http://urn.fi/URN:NBN:fi:au:slm:s1044 42 | 004903276 7001 L $$6880-04$$aDžafarova-Viitala, T. 43 | 004903276 88010 L $$6245-01/(N$$aВ сумасшедших небесах :$$bповест�� /$$cАнита Конкка ; перевод с финского Т. Джафаровой-Виитала. 44 | 004903276 880 L $$6260-02/(N$$aМосква :$$bУРСС,$$c2005 45 | 004903276 880 L $$6650-03/(N$$aпроза$$xпер. с финск. 46 | 004903276 8801 L $$6700-04/(N$$aДжафарова-Виитала, Т. 47 | -------------------------------------------------------------------------------- /test/input/jakaja.alephseq: -------------------------------------------------------------------------------- 1 | 000054087 FMT L BK 2 | 000054087 LDR L ^^^^^cam^a2201369zi^4500 3 | 000054087 001 L 000054087 4 | 000054087 005 L 20151222195217.0 5 | 000054087 008 L 900810s1990^^^^fi^||||||||||o||||||fin|| 6 | 000054087 015 L $$afx188512$$2skl 7 | 000054087 020 L $$a951-47-3208-1$$qnidottu 8 | 000054087 035 L $$a(FI-MELINDA)000054087 9 | 000054087 040 L $$aFI-NL 10 | 000054087 0410 L $$afin$$beng$$bswe$$bnor 11 | 000054087 042 L $$afinb 12 | 000054087 080 L $$a336.12$$x(480) 13 | 000054087 080 L $$a336.121 14 | 000054087 080 L $$a342.4 15 | 000054087 080 L $$a342.4$$x(480) 16 | 000054087 080 L $$a342$$9FENNI 17 | 000054087 080 L $$a336.1/.5 18 | 000054087 080 L $$a353/354$$9FENNI 19 | 000054087 080 L $$a336.12 20 | 000054087 080 L $$a336$$9FENNI 21 | 000054087 084 L $$aHo:2.1$$2z 22 | 000054087 084 L $$a33.041$$2ykl$$9FENNI 23 | 000054087 084 L $$a33.21$$2ykl$$9FENNI 24 | 000054087 084 L $$aHo:14.7$$2z 25 | 000054087 1101 L $$aPerustuslakien valtiontaloussäännösten uudistamiskomitea. 26 | 000054087 24510 L $$aPerustuslaki ja valtiontalous :$$bperustuslakien valtiontaloussäännösten uudistamiskomitean mietintö = Grundlagarna och statshushållningen : kommittén för revision av grundlagarnas stadganden om statshushållning. 27 | 000054087 260 L $$a[Helsinki] :$$bOikeusministeriö :$$bValtion painatuskeskus, jakaja,$$c1990. 28 | 000054087 300 L $$a236, [33] s. ;$$c25 cm +$$eliite ([214] s.) 29 | 000054087 336 L $$ateksti$$btxt$$2rdacontent 30 | 000054087 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 31 | 000054087 338 L $$anide$$bnc$$2rdacarrier 32 | 000054087 4901 L $$aKomiteanmietintö,$$x0356-9470 ;$$v1990,7 33 | 000054087 4901 L $$aKomiteanmietintö = Kommittébetänkande,$$x0356-9470 ;$$v1990, 7 34 | 000054087 4901 L $$aKomiteanmietintö;$$v1990, 7 35 | 000054087 500 L $$aLiite: Vertaileva selvitys perustuslakien valtiontaloussäännöksistä = Jämförande utredning angående grundlagarnas stadganden om statshusshållning$$9FENNI 36 | 000054087 500 L $$aLisäpainokset: 2. p. 1992.$$9FENNI 37 | 000054087 650 7 L $$avaltiontalous$$xlainsäädäntö$$2ysa 38 | 000054087 650 7 L $$atalousarviot$$2ysa 39 | 000054087 650 7 L $$alainsäädäntö$$2ysa$$9FENNI 40 | 000054087 650 7 L $$avaltion tulo- ja menoarviot$$2ysa$$9FENNI 41 | 000054087 650 7 L $$aperustuslait$$2ysa$$9FENNI 42 | 000054087 650 7 L $$avaltiontalous$$2ysa$$9FENNI 43 | 000054087 650 7 L $$avaltion tulo- ja menoarviot$$xlainsäädäntö$$2ysa 44 | 000054087 650 7 L $$askattelag$$2allars 45 | 000054087 650 7 L $$ariksdag$$2allars 46 | 000054087 650 7 L $$abudget$$xstatlig$$2allars 47 | 000054087 650 7 L $$astatsbudget$$2allars 48 | 000054087 650 7 L $$astatshushållning$$2allars 49 | 000054087 650 7 L $$agrundlagar$$2allars 50 | 000054087 650 7 L $$ariksdagsbehandling$$2allars 51 | 000054087 650 7 L $$aconstitutional law$$2cilla 52 | 000054087 650 7 L $$astate finance$$2cilla 53 | 000054087 650 7 L $$averolaki$$2eks 54 | 000054087 650 7 L $$alisätalousarvio$$2eks 55 | 000054087 650 7 L $$aEduskunta$$2eks 56 | 000054087 650 7 L $$avaltiontalous$$2eks 57 | 000054087 650 7 L $$ataloussuunnittelu$$2eks 58 | 000054087 650 7 L $$avaltion talousarviot$$2eks 59 | 000054087 650 7 L $$aeduskunta-aloitteet$$2eks 60 | 000054087 650 7 L $$alepäämään jättäminen$$2eks 61 | 000054087 650 7 L $$amäärärahat$$2eks 62 | 000054087 650 7 L $$averolait$$2eks 63 | 000054087 650 7 L $$aeduskuntakäsittely$$2eks 64 | 000054087 650 7 L $$aperustuslaki$$2eks 65 | 000054087 650 7 L $$abudjetti$$2eks 66 | 000054087 650 7 L $$atulo- ja menoarvio$$2eks 67 | 000054087 7400 L $$aVertaileva selvitys perustuslakien valtiontaloussäännöksistä. 68 | 000054087 7400 L $$aGrundlagarna och statshushållningen. 69 | 000054087 7400 L $$aKommittén för revision av grundlagarnas stadganden om statshushållning. 70 | 000054087 830 0 L $$aKomiteanmietintö = Kommittébetänkande,$$x0356-9470 ;$$v1990, 7. 71 | 000054087 830 0 L $$aKomiteanmietintö,$$x0356-9470 ;$$v1990,7. 72 | 000054087 9101 L $$aKommittén för revision av grundlagarnas stadganden om statshushållning$$yPerustuslakien valtiontaloussäännösten uudistamiskomitea 73 | 000055711 FMT L BK 74 | 000055711 LDR L 00000cam^a2200913zi^4500 75 | 000055711 001 L 000055711 76 | 000055711 005 L 20160908090434.0 77 | 000055711 008 L 910604s1990^^^^fi^|||||||||||||||||fin|| 78 | 000055711 015 L $$afx218742$$2skl 79 | 000055711 020 L $$a951-47-3928-0$$qnidottu 80 | 000055711 035 L $$a(FI-MELINDA)000055711 81 | 000055711 040 L $$aFI-NL 82 | 000055711 0410 L $$afin$$beng 83 | 000055711 042 L $$afinb 84 | 000055711 080 L $$a628.52 85 | 000055711 080 L $$a662.96 86 | 000055711 080 L $$a36.11 87 | 000055711 080 L $$a502/504$$9FENNI 88 | 000055711 080 L $$a551.5$$9FENNI 89 | 000055711 080 L $$a620.9.003$$x(480) 90 | 000055711 080 L $$a620.9$$9FENNI 91 | 000055711 084 L $$a36.11$$2ykl$$9FENNI 92 | 000055711 1001 L $$aKarkkulainen, Petteri. 93 | 000055711 24510 L $$aEnergiankäytön tehostuminen ja päästöjen väheneminen Suomessa vuosina 1973-1988 /$$cLappeenrannan teknillinen korkeakoulu, energiatekniikan osasto. 94 | 000055711 260 L $$aHelsinki :$$bKauppa- ja teollisuusministeriö :$$bValtion painatuskeskus [jakaja],$$c1990. 95 | 000055711 300 L $$a77, [13] s. :$$bkuvitettu ;$$c25 cm 96 | 000055711 336 L $$ateksti$$btxt$$2rdacontent 97 | 000055711 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 98 | 000055711 338 L $$anide$$bnc$$2rdacarrier 99 | 000055711 4901 L $$aKauppa- ja teollisuusministeriö. [Energiaosasto]. Sarja B,$$x0356-9284 ;$$v78 100 | 000055711 500 L $$aLaatinut Petteri Karkkulainen.$$9FENNI 101 | 000055711 500 L $$aTutkimuksen vastuullinen johtaja: Lasse Koskelainen ; tutkija: Petteri Karkkulainen. Liittyy VTT:n koordinoimaan energiansäästöprojektiin. 102 | 000055711 520 L $$aAbstract: The more efficient use of energy and the decrease of emissions in Finland 1973-1988.$$9FENNI 103 | 000055711 520 L $$aTiivistelmä (1 s.). - Abstract (1 s.). 104 | 000055711 650 7 L $$apäästöt$$xrikkidioksidi$$2ysa 105 | 000055711 650 7 L $$ahiilidioksidi$$2ysa$$9FENNI 106 | 000055711 650 7 L $$apäästöt$$xhiilidioksidi$$2ysa 107 | 000055711 650 7 L $$aenergiankulutus$$xpäästöt$$2ysa 108 | 000055711 650 7 L $$aenergiankulutus$$2ysa$$9FENNI 109 | 000055711 650 7 L $$aenergiansäästö$$2ysa$$9FENNI 110 | 000055711 650 7 L $$apäästöt$$2ysa$$9FENNI 111 | 000055711 650 7 L $$arikkidioksidi$$2ysa$$9FENNI 112 | 000055711 650 7 L $$atypen oksidit$$2ysa$$9FENNI 113 | 000055711 650 7 L $$apäästöt$$xtypen oksidit$$2ysa 114 | 000055711 650 7 L $$aenergia$$2eks 115 | 000055711 650 7 L $$ailmansuojelu$$2eks 116 | 000055711 650 7 L $$apäästöt$$2eks 117 | 000055711 7102 L $$aLappeenrannan teknillinen korkeakoulu.$$bEnergiatekniikan osasto. 118 | 000055711 8102 L $$aKauppa- ja teollisuusministeriö. [Energiaosasto].$$nSarja B,$$x0356-9284;$$v78 119 | -------------------------------------------------------------------------------- /test/input/jatuli.alephseq: -------------------------------------------------------------------------------- 1 | 000006753 FMT L BK 2 | 000006753 LDR L 00000cam^a2200457zi^4500 3 | 000006753 001 L 000006753 4 | 000006753 005 L 20170821033009.0 5 | 000006753 008 L 850314r19841949fi^|||||||||||||||||fin|| 6 | 000006753 015 L $$af850721$$2skl 7 | 000006753 035 L $$a(FI-MELINDA)000006753 8 | 000006753 040 L $$aFI-NL 9 | 000006753 0410 L $$afin 10 | 000006753 042 L $$afinb 11 | 000006753 080 L $$a908 Kemi$$9FENNI 12 | 000006753 24500 L $$aJatuli :$$bKemin kotiseutu- ja museoyhdistyksen julkaisu.$$n1 /$$c[toimituskunta: Aino Piispanen...ja muita] ; [toim.: Lauri Keränen]. 13 | 000006753 250 L $$aNäköisp. 14 | 000006753 260 L $$a[Kemi] :$$bPohjolan sanomat,$$c1984. 15 | 000006753 300 L $$a81, [21] s. :$$bkuvitettu, karttoja ;$$c26 cm 16 | 000006753 336 L $$ateksti$$btxt$$2rdacontent 17 | 000006753 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 18 | 000006753 338 L $$anide$$bnc$$2rdacarrier 19 | 000006753 500 L $$aIlmoituksia.$$9FENNI 20 | 000006753 500 L $$aNäköisp. Alkuteos julk.: Kemi : Kemin kotiseutu- ja museoyhdistys, 1949$$9FENNI 21 | 000006753 530 L $$aDigitaalinen kopio;$$cKäytettävissä vapaakappalekirjastoissa$$uhttp://urn.fi/URN:ISBN:978-0-357-35801-6$$9FENNI 22 | 000006753 7001 L $$aPiispanen, Aino. 23 | 000006753 7001 L $$aKeränen, Lauri,$$d1906-$$0(FIN11)000047367 24 | 000006753 7102 L $$aKemin kotiseutu- ja museoyhdistys. 25 | -------------------------------------------------------------------------------- /test/input/kalastusalue.alephseq: -------------------------------------------------------------------------------- 1 | 005951463 FMT L BK 2 | 005951463 LDR L 03404cam^a2200721^i^4500 3 | 005951463 001 L 005951463 4 | 005951463 005 L 20190704054727.0 5 | 005951463 008 L 111006s2011^^^^fi^||||^^^^^^^00|^0|fin|^ 6 | 005951463 015 L $$afx978702$$2skl 7 | 005951463 020 L $$a978-952-9856-53-4$$qnidottu 8 | 005951463 035 L $$a(FI-MELINDA)005951463 9 | 005951463 040 L $$aFI-NL 10 | 005951463 0410 L $$afin 11 | 005951463 042 L $$afinb 12 | 005951463 080 L $$a639.2/.6$$21974/fin/fennica$$9FENNI 13 | 005951463 1001 L $$aPyyvaara, Päivi.$$0(FIN11)000117561 14 | 005951463 24510 L $$aPirkkalan kalastusalue :$$breittivesien käyttö- ja hoitosuunnitelma 2011-2020 /$$c[työryhmä: Hannu Jokela ja Ami Solin ; suunnitelman laatija: Päivi Pyyvaara]. 15 | 005951463 260 L $$a[Tampere] :$$bPro Agria Pirkanmaa, Pirkanmaan kalatalouskeskus,$$c[2011]$$e(Tampere :$$fKopijyvä) 16 | 005951463 300 L $$a51 s. :$$bkuvitettu, karttoja ;$$c30 cm 17 | 005951463 336 L $$ateksti$$btxt$$2rdacontent 18 | 005951463 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 19 | 005951463 338 L $$anide$$bnc$$2rdacarrier 20 | 005951463 4901 L $$a[Pirkanmaan kalatalouskeskuksen tiedonantoja],$$x0789-9750 21 | 005951463 530 L $$uJulkaistu myös verkkoaineistona.$$9FENNI 22 | 005951463 650 7 L $$akalastus$$2yso/fin$$0http://www.yso.fi/onto/yso/p1686$$9FENNI 23 | 005951463 650 7 L $$avesienhoito$$2yso/fin$$0http://www.yso.fi/onto/yso/p3161$$9FENNI 24 | 005951463 650 7 L $$akalavedet$$2yso/fin$$0http://www.yso.fi/onto/yso/p348$$9FENNI 25 | 005951463 650 7 L $$akalastusalueet$$2yso/fin$$0http://www.yso.fi/onto/yso/p346$$9FENNI 26 | 005951463 650 7 L $$akalakannat$$2yso/fin$$0http://www.yso.fi/onto/yso/p8529$$9FENNI 27 | 005951463 650 7 L $$akalakantojen hoito$$2yso/fin$$0http://www.yso.fi/onto/yso/p22184$$9FENNI 28 | 005951463 650 7 L $$akalanistutus$$2yso/fin$$0http://www.yso.fi/onto/yso/p5097$$9FENNI 29 | 005951463 650 7 L $$afiske$$2yso/swe$$0http://www.yso.fi/onto/yso/p1686 30 | 005951463 650 7 L $$avattenvård$$2yso/swe$$0http://www.yso.fi/onto/yso/p3161 31 | 005951463 650 7 L $$afiskevatten$$2yso/swe$$0http://www.yso.fi/onto/yso/p348 32 | 005951463 650 7 L $$afiskeområden$$2yso/swe$$0http://www.yso.fi/onto/yso/p346 33 | 005951463 650 7 L $$afiskbestånd$$2yso/swe$$0http://www.yso.fi/onto/yso/p8529 34 | 005951463 650 7 L $$askötsel av fiskbestånd$$2yso/swe$$0http://www.yso.fi/onto/yso/p22184 35 | 005951463 650 7 L $$afiskutplantering$$2yso/swe$$0http://www.yso.fi/onto/yso/p5097 36 | 005951463 651 7 L $$aPirkanmaa$$2yso/fin$$0http://www.yso.fi/onto/yso/p94339$$9FENNI 37 | 005951463 651 7 L $$aBirkaland$$2yso/swe$$0http://www.yso.fi/onto/yso/p94339 38 | 005951463 7001 L $$aJokela, Hannu. 39 | 005951463 7001 L $$aSolin, Ami. 40 | 005951463 830 0 L $$aPirkanmaan kalatalouskeskuksen tiedonantoja,$$x0789-9750. 41 | 005951463 85641 L $$uhttp://www.pirkkalankalastusalue.net/images/PIRKKALA_KA_KAHO_2011_2020.pdf$$yLinkki verkkoaineistoon 42 | 005951463 901 L $$aMU20111124$$5FENNI 43 | 005951463 904 L $$ap$$5FENNI 44 | -------------------------------------------------------------------------------- /test/input/kollaakestaa.alephseq: -------------------------------------------------------------------------------- 1 | 000035090 FMT L BK 2 | 000035090 LDR L ^^^^^cam^a2200697zi^4500 3 | 000035090 001 L 000035090 4 | 000035090 005 L 20170119054059.0 5 | 000035090 008 L 810317s1980^^^^fi^|||||||||||||||||fin|| 6 | 000035090 015 L $$afx37323$$2skl 7 | 000035090 020 L $$a951-0-10088-9$$qsidottu 8 | 000035090 035 L $$a(FI-MELINDA)000035090 9 | 000035090 040 L $$aFI-NL 10 | 000035090 0410 L $$afin 11 | 000035090 042 L $$afinb 12 | 000035090 080 L $$a92 13 | 000035090 080 L $$a355/359$$9FENNI 14 | 000035090 080 L $$a929$$9FENNI 15 | 000035090 080 L $$a948.0.08$$9FENNI 16 | 000035090 084 L $$a92.73$$2ykl 17 | 000035090 1001 L $$aPalolampi, Erkki,$$d1908-1991. 18 | 000035090 24510 L $$aKollaa kestää /$$cErkki Palolampi. 19 | 000035090 250 L $$a10. p., [101. tuhat]. 20 | 000035090 260 L $$aPorvoo ;$$aHki ;$$aJuva :$$bWSOY,$$c1980$$e(Porvoo) 21 | 000035090 300 L $$a285, [2] s. :$$bkuvitettu, karttoja ;$$c22 cm 22 | 000035090 336 L $$ateksti$$btxt$$2rdacontent 23 | 000035090 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 24 | 000035090 338 L $$anide$$bnc$$2rdacarrier 25 | 000035090 500 L $$a9. p. 1962.$$9FENNI 26 | 000035090 5050 L $$aLiitteenä sotahistoriallinen katsaus: Kollaan rintama - talvisodan pienoiskuva / kirj. K. J. Mikola$$9FENNI 27 | 000035090 500 L $$aKielletyt kirjat 28 | 000035090 650 7 L $$atalvisota$$xtaistelut$$zKollaanjoki$$2ysa 29 | 000035090 650 7 L $$asotahistoria$$xtalvisota$$zSuomi$$y1939-1940$$2ysa 30 | 000035090 650 7 L $$ataistelut$$xKollaa$$2ysa 31 | 000035090 7001 L $$aMikola, Keijo Johannes. 32 | 000035090 7001 L $$aMikola, Keijo,$$d1909-2001.$$tKollaan rintama - talvisodan pienoiskuva. 33 | -------------------------------------------------------------------------------- /test/input/kolmestilaukeava.alephseq: -------------------------------------------------------------------------------- 1 | 005814421 FMT L BK 2 | 005814421 LDR L 00000cam^a2200865^i^4500 3 | 005814421 001 L 005814421 4 | 005814421 005 L 20170901034949.0 5 | 005814421 008 L 100806s2010^^^^fi^|||||^^^^^|00|^f|fin|^ 6 | 005814421 015 L $$afx948369$$2skl 7 | 005814421 020 L $$a978-951-0-37204-3$$qnidottu 8 | 005814421 0248 L $$aA1520889 9 | 005814421 035 L $$z(FI-MELINDA)005746450 10 | 005814421 035 L $$a(FI-MELINDA)005814421 11 | 005814421 040 L $$aFI-NL 12 | 005814421 0410 L $$afin 13 | 005814421 042 L $$afinb 14 | 005814421 080 L $$a894.541$$x-3$$9FENNI 15 | 005814421 084 L $$a84.2$$2ykl 16 | 005814421 084 L $$aJännitys$$2ykl 17 | 005814421 1001 L $$aNykänen, Harri,$$d1953-$$0(FIN11)000068186 18 | 005814421 24510 L $$aKolmesti laukeava /$$cHarri Nykänen. 19 | 005814421 260 L $$aHelsinki :$$bWSOY,$$c2010$$e(Juva :$$fWS Bookwell) 20 | 005814421 300 L $$a621 s. ;$$c18 cm 21 | 005814421 336 L $$ateksti$$btxt$$2rdacontent 22 | 005814421 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 23 | 005814421 338 L $$anide$$bnc$$2rdacarrier 24 | 005814421 4900 L $$aJohnny & Bantzo 25 | 005814421 4900 L $$aWSOY pokkari 26 | 005814421 5050 L $$tJohnny & Bantzo,$$g4. p.$$tOperaatio Banana Split,$$g3. p.$$tViimeinen hippi,$$g2. p.$$9FENNI 27 | 005814421 5050 L $$aJohnny & Bantzo, 4. p. ; Operaatio Banana Split, 3. p. ; Viimeinen hippi, 2. p. 28 | 005814421 60004 L $$aBantzo,$$c(fiktiivinen hahmo) 29 | 005814421 60004 L $$aJohnny,$$c(fiktiivinen hahmo) 30 | 005814421 650 7 L $$aalamaailma$$2kaunokki 31 | 005814421 650 7 L $$akaunokirjallisuus$$xsuomenkielinen kirjallisuus$$2ysa 32 | 005814421 650 7 L $$akriminalfiktion$$xfinska$$2bella 33 | 005814421 650 7 L $$amusta huumori$$2kaunokki 34 | 005814421 650 7 L $$apoliisikirjallisuus$$2kaunokki 35 | 005814421 650 7 L $$arikoskirjallisuus$$2kaunokki 36 | 005814421 650 7 L $$arikospoliisi$$zHelsinki$$2kaunokki 37 | 005814421 650 7 L $$aromaanit$$xsuomen kieli$$2ysa 38 | 005814421 70012 L $$aNykänen, Harri,$$d1953-$$tJohnny & Bantzo.$$0(FIN11)000068186 39 | 005814421 70012 L $$aNykänen, Harri,$$d1953-$$tOperaatio Banana Split.$$0(FIN11)000068186 40 | 005814421 70012 L $$aNykänen, Harri,$$d1953-$$tViimeinen hippi.$$0(FIN11)000068186 41 | 005814421 7400 L $$aJohnny & Bantzo. 42 | 005814421 7400 L $$aOperaatio Banana Split. 43 | 005814421 7400 L $$aViimeinen hippi. 44 | 005814421 7001 L $$aNykänen, Harri,$$d1953-$$tJohnny & Bantzo.$$0(FIN11)000068186 45 | 005814421 7001 L $$aNykänen, Harri,$$d1953-$$tOperaatio Banana Split.$$0(FIN11)000068186 46 | 005814421 7001 L $$aNykänen, Harri,$$d1953-$$tViimeinen hippi.$$0(FIN11)000068186 47 | 005814421 830 0 L $$aWSOY pokkari. 48 | 005814421 830 0 L $$aJohnny & Bantzo. 49 | -------------------------------------------------------------------------------- /test/input/kotkankasvisto.alephseq: -------------------------------------------------------------------------------- 1 | 006419003 FMT L BK 2 | 006419003 LDR L 00000cam^a22003012i^4500 3 | 006419003 001 L 006419003 4 | 006419003 005 L 20170829092526.0 5 | 006419003 008 L 960607s1927^^^^fi^|||||||||||||||||fin|| 6 | 006419003 015 L $$af474260$$2skl 7 | 006419003 035 L $$a(FI-MELINDA)006419003 8 | 006419003 040 L $$aFI-NL 9 | 006419003 0410 L $$afin 10 | 006419003 042 L $$afinb 11 | 006419003 1001 L $$aUlvinen, Arvi,$$d1897-$$0(FIN11)000061725 12 | 006419003 24510 L $$aKotkan sataman ja rata-alueen kasvisto vv. 1914-1924 /$$cArvi Ulvinen. 13 | 006419003 260 L $$aHelsinki :$$bVanamo,$$c1927. 14 | 006419003 300 L $$aS. 332-344. 15 | 006419003 336 L $$ateksti$$btxt$$2rdacontent 16 | 006419003 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 17 | 006419003 338 L $$anide$$bnc$$2rdacarrier 18 | 006419003 4901 L $$aAnnales Societatis zoologicae-botanicae Fennicae Vanamo,$$x0788-6942 ;$$v5 osa, 8 19 | 006419003 830 0 L $$aAnnales Societatis zoologicae-botanicae Fennicae Vanamo,$$x0788-6942 ;$$v5 osa, 8. 20 | -------------------------------------------------------------------------------- /test/input/langpart.alephseq: -------------------------------------------------------------------------------- 1 | 000006980 FMT L BK 2 | 000006980 LDR L ^^^^^cam^a2200529zi^4500 3 | 000006980 001 L 000006980 4 | 000006980 005 L 20151222163835.0 5 | 000006980 008 L 851008s1985^^^^fi^|||||||||||||||||swe|| 6 | 000006980 015 L $$af853072$$2skl 7 | 000006980 035 L $$a(FI-MELINDA)000006980 8 | 000006980 040 L $$aFI-NL 9 | 000006980 0411 L $$aswe$$hfin 10 | 000006980 042 L $$afinb 11 | 000006980 080 L $$a06$$9FENNI 12 | 000006980 080 L $$a676$$9FENNI 13 | 000006980 080 L $$a069.02$$9FENNI 14 | 000006980 1102 L $$aVerlan tehdasmuseo. 15 | 000006980 24010 L $$aVerlan tehdasmuseo 16 | 000006980 24510 L $$aVerla fabriksmuseum /$$c[Veikko Talvi]. 17 | 000006980 260 L $$aVerla :$$bKymmene-Strömberg ab,$$c1985$$e([Kouvola] :$$fKouvolan kirjap.) 18 | 000006980 300 L $$a[2], 20, [2] s. :$$bkuvitettu, karttoja ;$$c18 cm 19 | 000006980 336 L $$ateksti$$btxt$$2rdacontent 20 | 000006980 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 21 | 000006980 338 L $$anide$$bnc$$2rdacarrier 22 | 000006980 61024 L $$aVerla fabriksmuseum. 23 | 000006980 7001 L $$aTalvi, Veikko. 24 | 000006980 903 L $$ab$$5FENNI 25 | 000006980 904 L $$ap$$5FENNI 26 | 000006980 9102 L $$aVerla fabriksmuseum$$yVerlan tehdasmuseo 27 | 000007655 FMT L BK 28 | 000007655 LDR L ^^^^^cam^a2200613zi^4500 29 | 000007655 001 L 000007655 30 | 000007655 005 L 20151222164446.0 31 | 000007655 008 L 871007s1987^^^^fi^|||||||||||||||||fin|| 32 | 000007655 015 L $$af872658$$2skl 33 | 000007655 035 L $$a(FI-MELINDA)000007655 34 | 000007655 040 L $$aFI-NL 35 | 000007655 0411 L $$afin$$hswe 36 | 000007655 042 L $$afinb 37 | 000007655 080 L $$a637$$9FENNI 38 | 000007655 1001 L $$aKarlsson, Svenolof. 39 | 000007655 24010 L $$aHistorien om Vasa-mjölken : ...och mejeriandelslaget Milka under femtio år 40 | 000007655 24510 L $$aVaasalaisen maidon historiaa :$$b...ja meijeriosuuskunta Milkan historiaa viideltä vuosikymmeneltä /$$c[Svenolof Karlsson] ; [suom. Tuija Nikko]. 41 | 000007655 260 L $$aVaasa :$$bMeijeriosuuskunta Milka,$$c1987$$f(Fram) 42 | 000007655 300 L $$a295 s. :$$bkuvitettu, karttoja ;$$c25 cm 43 | 000007655 336 L $$ateksti$$btxt$$2rdacontent 44 | 000007655 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 45 | 000007655 338 L $$anide$$bnc$$2rdacarrier 46 | 000007655 61024 L $$aMilka (Meijeriosuuskunta). 47 | 000007655 650 7 L $$ayrityshistoriikit$$2ysa$$9FENNI 48 | 000007655 650 7 L $$ameijerit$$2ysa$$9FENNI 49 | 000007655 650 7 L $$ameijerit$$zVaasa$$2ysa 50 | 000007655 650 7 L $$amaitotalous$$2eks 51 | 000007655 650 7 L $$ameijerit$$2eks 52 | 000007655 651 7 L $$aVaasa$$2ysa$$9FENNI 53 | 000007655 7001 L $$aNikko, Tuija. 54 | 000007655 7102 L $$aMilka(mejeriandelslaget) 55 | -------------------------------------------------------------------------------- /test/input/monot.alephseq: -------------------------------------------------------------------------------- 1 | 004871089 FMT L BK 2 | 004871089 LDR L 00000cam^a2200805^i^4500 3 | 004871089 001 L 004871089 4 | 004871089 005 L 20170817223556.0 5 | 004871089 008 L 080909s2008^^^^fi^||||||||||||||||afin|^ 6 | 004871089 015 L $$afx892691$$2skl 7 | 004871089 020 L $$a978-951-1-20649-1$$qsidottu 8 | 004871089 0243 L $$a9789511206491 9 | 004871089 0248 L $$aA1296415 10 | 004871089 035 L $$a(FI-MELINDA)004871089 11 | 004871089 040 L $$aFI-NL 12 | 004871089 0410 L $$afin 13 | 004871089 042 L $$afinb 14 | 004871089 072 7 L $$a87$$2kkaa 15 | 004871089 080 L $$a929 Harjanne$$9FENNI 16 | 004871089 080 L $$a82$$9FENNI 17 | 004871089 084 L $$a86.2$$2ykl$$9FENNI 18 | 004871089 084 L $$a86.2 19 | 004871089 084 L $$a86.2174$$2ykl 20 | 004871089 084 L $$a86.11$$2ykl 21 | 004871089 1001 L $$aHarjanne, Maikki,$$d1944-$$0(FIN11)000043264 22 | 004871089 24510 L $$aIlmaiset monot /$$cMaikki Harjanne. 23 | 004871089 260 L $$aHelsingissä :$$bOtava,$$c2008$$e(Keuruu :$$fOtavan Kirjapaino) 24 | 004871089 300 L $$a116 s. :$$bkuvitettu ;$$c23 cm 25 | 004871089 336 L $$ateksti$$btxt$$2rdacontent 26 | 004871089 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 27 | 004871089 338 L $$anide$$bnc$$2rdacarrier 28 | 004871089 60014 L $$aHarjanne, Maikki,$$d1944-$$0(FIN11)000043264$$9FENNI 29 | 004871089 650 7 L $$amuistelmat$$2ysa$$9FENNI 30 | 004871089 650 7 L $$akirjailijat$$2ysa$$9FENNI 31 | 004871089 650 7 L $$akuvittajat$$2ysa$$9FENNI 32 | 004871089 650 7 L $$alastenkirjailijat$$2ysa 33 | 004871089 650 7 L $$akirjailijat$$xmuistelmat$$zSuomi$$y1900-luku$$2kitu 34 | 004871089 650 7 L $$alastenkirjallisuus$$xkirjailijat$$zSuomi$$y1900-luku$$2kitu 35 | 004871089 650 7 L $$akirjailijat$$xmuistelmat$$2ysa 36 | 004871089 901 L $$aMU20080909$$5FENNI 37 | 004871089 908 L $$afi 38 | 004871089 908 L $$afin 39 | -------------------------------------------------------------------------------- /test/input/origwork.alephseq: -------------------------------------------------------------------------------- 1 | 000041181 FMT L BK 2 | 000041181 LDR L ^^^^^cam^a2200733zi^4500 3 | 000041181 001 L 000041181 4 | 000041181 005 L 20160203051905.0 5 | 000041181 008 L 861111s1986^^^^fi^||||||||||||||||bfin|| 6 | 000041181 015 L $$afx86304$$2skl 7 | 000041181 020 L $$a951-622-360-5$$qnidottu 8 | 000041181 035 L $$a(FI-MELINDA)000041181 9 | 000041181 040 L $$aFI-NL 10 | 000041181 0411 L $$afin$$heng 11 | 000041181 042 L $$afinb 12 | 000041181 080 L $$a929 Roseveare,Helen 13 | 000041181 080 L $$a929 Roseveare$$9FENNI 14 | 000041181 080 L $$a26$$9FENNI 15 | 000041181 084 L $$a99.1*$$2ykl 16 | 000041181 084 L $$a99.15$$2ykl 17 | 000041181 084 L $$a26.2$$2ykl 18 | 000041181 084 L $$a99.12$$2ykl 19 | 000041181 1001 L $$aBurgess, Alan. 20 | 000041181 24510 L $$aHelen Roseveare :$$bauringon täytyy nousta /$$cAlan Burgess ; [englannin kielestä suom. Oili Aho]. 21 | 000041181 260 L $$aHämeenlinna :$$bPäivä,$$c1986$$e(Jyväskylä :$$fGummerus) 22 | 000041181 300 L $$a223, [1] s. :$$bmuotokuva ;$$c21 cm 23 | 000041181 336 L $$ateksti$$btxt$$2rdacontent 24 | 000041181 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 25 | 000041181 338 L $$anide$$bnc$$2rdacarrier 26 | 000041181 500 L $$aENGL. ALKUTEOS: DAYLIGHT MUST COME. 27 | 000041181 500 L $$aSELKÄNIMEKE: AURINGON TÄYTYY NOUSTA. 28 | 000041181 60014 L $$aRoseveare, Helen.$$9FENNI 29 | 000041181 650 7 L $$amuistelmat$$zAfrikka$$2ysa 30 | 000041181 650 7 L $$amuistelmat$$xlääkärit$$2ysa 31 | 000041181 650 7 L $$amuistelmat$$xlähetystyöntekijät$$2ysa 32 | 000041181 650 7 L $$alähetystyö$$zKongo$$2ysa 33 | 000041181 651 7 L $$aAfrika$$2allars 34 | 000041181 651 7 L $$aKongo$$2allars 35 | 000041181 7001 L $$aAho, Oili,$$ekääntäjä. 36 | 000041181 7400 L $$aAuringon täytyy nousta. 37 | 000419615 FMT L BK 38 | 000419615 LDR L 00000cam^a2200757^i^4500 39 | 000419615 001 L 000419615 40 | 000419615 005 L 20160907160559.0 41 | 000419615 008 L 060622s2006^^^^fi^|||||||||||||||||fin|^ 42 | 000419615 015 L $$afx829017$$2skl 43 | 000419615 020 L $$a951-9486-02-X$$qnidottu 44 | 000419615 035 L $$a(FI-MELINDA)000419615 45 | 000419615 040 L $$aFI-NL 46 | 000419615 0411 L $$afin$$heng 47 | 000419615 042 L $$afinb 48 | 000419615 080 L $$a003$$9FENNI 49 | 000419615 080 L $$a78$$9FENNI 50 | 000419615 084 L $$a38.553$$2ykl$$9FENNI 51 | 000419615 084 L $$a78.27$$2ykl$$9FENNI 52 | 000419615 084 L $$2ykl 53 | 000419615 1300 L $$aNew international manual of Braille music notation. 54 | 000419615 24510 L $$aPisteet 2000 :$$buusi kansainvälinen pistenuottikirjoituksen käsikirja /$$ctoimittanut Bettye Krolick ; suomentaneet Outi Jyrhämä, Oili Piippo ja Raimo Tanskanen. 55 | 000419615 260 L $$aHelsinki :$$bBraille-neuvottelukunta :$$bCelia, näkövammaisten kirjasto,$$c2006$$f(Edita) 56 | 000419615 300 L $$aXVI, 278 s. :$$bnuotteja ;$$c30 cm 57 | 000419615 336 L $$ateksti$$btxt$$2rdacontent 58 | 000419615 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 59 | 000419615 338 L $$anide$$bnc$$2rdacarrier 60 | 000419615 4901 L $$aBraille-neuvottelukunnan julkaisuja ;$$v2 61 | 000419615 650 7 L $$apistekirjoitus$$2ysa$$9FENNI 62 | 000419615 650 7 L $$anuottikirjoitus$$2ysa$$9FENNI 63 | 000419615 650 7 L $$anäkövammaiset$$2ysa$$9FENNI 64 | 000419615 650 7 L $$asokeat$$2ysa$$9FENNI 65 | 000419615 7001 L $$aKrolick, Bettye. 66 | 000419615 7001 L $$aJyrhämä, Outi. 67 | 000419615 7001 L $$aPiippo, Oili. 68 | 000419615 7001 L $$aTanskanen, Raimo,$$d1937- 69 | 000419615 7102 L $$aBraille-neuvottelukunta. 70 | 000419615 7102 L $$aCelia - Näkövammaisten kirjasto. 71 | 000419615 7400 L $$aUusi kansainvälinen pistenuottikirjoituksen käsikirja. 72 | 000419615 830 0 L $$aBraille-neuvottelukunnan julkaisuja ;$$v2. 73 | 000419615 830 0 L $$aBraille-delegationens publikationer,$$x1457-6589 ;$$v2. 74 | 000419615 901 L $$aMU20060811$$5FENNI 75 | 000419615 901 L $$bLUOK, SISKUV$$5FENNI$$c20150629150759.0 76 | 002717173 FMT L BK 77 | 002717173 LDR L ^^^^^cam^a22005892i^4500 78 | 002717173 001 L 002717173 79 | 002717173 005 L 20151228170259.0 80 | 002717173 008 L 971007s1909^^^^fi^|||||||||||||||||fin|| 81 | 002717173 015 L $$af426856$$2skl 82 | 002717173 035 L $$a(FI-MELINDA)002717173 83 | 002717173 040 L $$aFI-NL 84 | 002717173 0411 L $$afin$$hund 85 | 002717173 042 L $$afinb 86 | 002717173 080 L $$a330 87 | 002717173 084 L $$a36.07$$2ykl 88 | 002717173 1001 L $$aWestergaard, Harald Ludvig. 89 | 002717173 24510 L $$aKansantaloustieteen pääpiirteet /$$cHarald Westergaard. 90 | 002717173 260 L $$aPorvoo :$$bWSOY,$$c1909. 91 | 002717173 300 L $$aVII, [1], 203 s. 92 | 002717173 336 L $$ateksti$$btxt$$2rdacontent 93 | 002717173 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 94 | 002717173 338 L $$anide$$bnc$$2rdacarrier 95 | 002717173 500 L $$aAlkuteos : Nationalökonimien i hovedtraek. 96 | 002717173 500 L $$aSuomennos$$9FENNI 97 | 002717173 563 L $$aSidottu. 98 | 002717173 650 7 L $$akansantaloustiede$$2ysa 99 | 002717173 653 L $$akansantaloustiede 100 | 002717173 653 L $$aEconomic science 101 | -------------------------------------------------------------------------------- /test/input/part-uri.alephseq: -------------------------------------------------------------------------------- 1 | 006835912 FMT L BK 2 | 006835912 LDR L ^^^^^cam^a2200865^i^4500 3 | 006835912 001 L 006835912 4 | 006835912 005 L 20160617182958.0 5 | 006835912 008 L 140828s2014^^^^fi^||||^^u^^^||0|^0|fin|^ 6 | 006835912 020 L $$a978-952-242-280-4$$qnidottu 7 | 006835912 035 L $$a(FI-MELINDA)006835912 8 | 006835912 040 L $$aFI-NL 9 | 006835912 0410 L $$afin$$aeng 10 | 006835912 042 L $$afinb 11 | 006835912 072 7 L $$a37$$2kkaa 12 | 006835912 080 L $$a006$$9FENNI 13 | 006835912 080 L $$a621$$9FENNI 14 | 006835912 080 L $$a628$$9FENNI 15 | 006835912 080 L $$a696/697$$9FENNI 16 | 006835912 080 L $$a628.2 17 | 006835912 084 L $$a66.34081$$2ykl$$9FENNI 18 | 006835912 084 L $$a66.93081$$2ykl$$9FENNI 19 | 006835912 24500 L $$aViemäreiden sisäpuoliset saneerausmenetelmät =$$bRenovation of drains and sewers with no-dig methods. 20 | 006835912 24631 L $$aRenovation of drains and sewers with no-dig methods 21 | 006835912 250 L $$a1. p. 22 | 006835912 260 L $$aHelsinki :$$bSuomen standardisoimisliitto,$$c2014. 23 | 006835912 300 L $$a363, 129 s. :$$bkuvitettu ;$$c30 cm 24 | 006835912 336 L $$ateksti$$btxt$$2rdacontent 25 | 006835912 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 26 | 006835912 338 L $$anide$$bnc$$2rdacarrier 27 | 006835912 4901 L $$aSFS-käsikirja,$$x0780-7961 ;$$v101 28 | 006835912 500 L $$aLaadittu yhteistyössä Muoviteollisuus ry:n kanssa.$$9FENNI 29 | 006835912 50580 L $$tViemäreiden sisäpuoliset saneerausmenetelmät : raportti /$$rKaunisto, Tuija ja$$rPelto-Huikko, Aino$$gs. 1-129.$$uhttp://urn.fi/URN:ISBN:978-951-633-128-0$$9FENNI 30 | 006835912 546 L $$aTekstiä suomeksi ja englanniksi.$$9FENNI 31 | 006835912 579 L $$aXLUETTELOITU$$bsavon 32 | 006835912 650 7 L $$astandardit$$2ysa 33 | 006835912 650 7 L $$aviemärit$$2ysa$$9FENNI 34 | 006835912 650 7 L $$aviemäriverkot$$2ysa$$9FENNI 35 | 006835912 650 7 L $$asaneeraus$$2ysa$$9FENNI 36 | 006835912 650 7 L $$akunnostus$$2ysa$$9FENNI 37 | 006835912 650 7 L $$aputket$$2ysa$$9FENNI 38 | 006835912 650 7 L $$amuoviputket$$2ysa$$9FENNI 39 | 006835912 650 7 L $$ametalliputket$$2ysa$$9FENNI 40 | 006835912 650 7 L $$astandarder$$2allars 41 | 006835912 650 7 L $$aavloppsledningar$$2allars 42 | 006835912 650 7 L $$asanering$$2allars 43 | 006835912 655 7 L $$astandardit$$2ysa$$9FENNI 44 | 006835912 7001 L $$aKaunisto, Tuija,$$d1955-$$ekirjoittaja. 45 | 006835912 7001 L $$aPelto-Huikko, Aino,$$ekirjoittaja. 46 | 006835912 7102 L $$aSuomen standardisoimisliitto. 47 | 006835912 7102 L $$aMuoviteollisuus (yhdistys) 48 | 006835912 830 0 L $$aSFS-käsikirja,$$x0780-7961 ;$$v101. 49 | -------------------------------------------------------------------------------- /test/input/poliisi.alephseq: -------------------------------------------------------------------------------- 1 | 000254001 FMT L BK 2 | 000254001 LDR L 00000cam^a2200673^i^4500 3 | 000254001 001 L 000254001 4 | 000254001 005 L 20170827054119.0 5 | 000254001 008 L 021024s2001^^^^fi^||||||||||o000|||fin|^ 6 | 000254001 015 L $$afx714386$$2skl 7 | 000254001 020 L $$a951-734-412-0$$qnidottu 8 | 000254001 035 L $$a(FI-MELINDA)000254001 9 | 000254001 040 L $$aFI-NL 10 | 000254001 0410 L $$afin 11 | 000254001 042 L $$afinb 12 | 000254001 080 L $$a351/354$$9FENNI 13 | 000254001 080 L $$a336$$9FENNI 14 | 000254001 084 L $$a35.7$$2ykl$$9FENNI 15 | 000254001 1101 L $$aSuomi.$$bSisäasiainministeriö.$$bPoliisiosasto.$$0(FIN11)000034267 16 | 000254001 24510 L $$aPoliisin talousvastuu läänitasolla. 17 | 000254001 260 L $$aHelsinki :$$bSisäasiainministeriö, poliisiosasto,$$c2001. 18 | 000254001 300 L $$a18, [1] lehteä ;$$c30 cm 19 | 000254001 336 L $$ateksti$$btxt$$2rdacontent 20 | 000254001 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 21 | 000254001 338 L $$anide$$bnc$$2rdacarrier 22 | 000254001 4901 L $$aPoliisiosaston julkaisu,$$x1236-049X ;$$v2001, 7 23 | 000254001 4901 L $$aPoliisiosaston julkaisu / Sisäasiainministeriö,$$x;$$v7/2001 24 | 000254001 650 7 L $$apoliisi$$2ysa$$9FENNI 25 | 000254001 650 7 L $$ataloudellinen vastuu$$2ysa$$9FENNI 26 | 000254001 650 7 L $$amäärärahat$$2ysa$$9FENNI 27 | 000254001 650 7 L $$atalousarviot$$2ysa$$9FENNI 28 | 000254001 650 7 L $$ataloussuunnittelu$$2ysa$$9FENNI 29 | 000254001 650 7 L $$atalous$$xvastuu$$2ysa 30 | 000254001 650 7 L $$apolisen$$xekonomi$$xansvar$$2allars 31 | 000254001 650 7 L $$aekonomi$$xansvar$$2allars 32 | 000254001 653 L $$atalousvastuu 33 | 000254001 830 0 L $$aPoliisiosaston julkaisu,$$x1236-049X ;$$v2001, 7. 34 | 000254001 830 0 L $$aPoliisiosaston julkaisu / Sisäasiainministeriö,$$x;$$v7/2001. 35 | -------------------------------------------------------------------------------- /test/input/prepub.alephseq: -------------------------------------------------------------------------------- 1 | 005661800 FMT L BK 2 | 005661800 LDR L ^^^^^cam^a2201237^i^4500 3 | 005661800 001 L 005661800 4 | 005661800 005 L 20160203004706.0 5 | 005661800 008 L 091120s2009^^^^fi^||||^^^^^^|00|^0|fin|^ 6 | 005661800 015 L $$afx929804$$2skl 7 | 005661800 020 L $$a978-952-5329-80-3$$qnidottu 8 | 005661800 0243 L $$a9789525329803 9 | 005661800 0248 L $$aA1427626 10 | 005661800 035 L $$a(FI-MELINDA)005661800 11 | 005661800 040 L $$aFI-NL 12 | 005661800 0410 L $$afin$$bswe 13 | 005661800 042 L $$afinb 14 | 005661800 072 7 L $$a06$$2kkaa 15 | 005661800 080 L $$a061$$9FENNI 16 | 005661800 080 L $$a52$$9FENNI 17 | 005661800 084 L $$a52.02$$2ykl$$9FENNI 18 | 005661800 084 L $$a528$$2uef 19 | 005661800 1001 L $$aMarkkanen, Tapio. 20 | 005661800 24510 L $$aParatiisista katsoen :$$btähtitaivaan karttojen historiaa /$$cTapio Markkanen. 21 | 005661800 24630 L $$aTähtitaivaan karttojen historiaa 22 | 005661800 260 L $$aHelsingissä :$$bUrsa,$$c2009$$e(Jyväskylä :$$fGummerus kirjapaino) 23 | 005661800 300 L $$a143 s. :$$bkuvitettu, karttoja ;$$c30 cm 24 | 005661800 336 L $$ateksti$$btxt$$2rdacontent 25 | 005661800 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 26 | 005661800 338 L $$anide$$bnc$$2rdacarrier 27 | 005661800 4901 L $$aUrsan julkaisuja,$$x0357-7937 ;$$v117 28 | 005661800 500 L $$aNäyttely Kansalliskirjastossa 12.11.2009-10.4.2010.$$9FENNI 29 | 005661800 520 L $$aRuotsinkielinen tiivistelmä: Sett från paradiset : stjärnkartornas historia.$$9FENNI 30 | 005661800 520 L $$aSett från paradiset : stjärnkartornas historia. 31 | 005661800 520 L $$a[Tiivistelmä]: Sett från paradiset : stjärnkartornas historia. 32 | 005661800 650 7 L $$atähtitiede$$xhistoria$$2ysa 33 | 005661800 650 7 L $$atähtikartat$$xhistoria$$2ysa 34 | 005661800 650 7 L $$ahistoria$$2ysa$$9FENNI 35 | 005661800 650 7 L $$akartat$$2ysa$$9FENNI 36 | 005661800 650 7 L $$akartoitus$$2ysa$$9FENNI 37 | 005661800 650 7 L $$amaailmankaikkeus$$2ysa$$9FENNI 38 | 005661800 650 7 L $$ataivas$$2ysa$$9FENNI 39 | 005661800 650 7 L $$atähdistöt$$2ysa$$9FENNI 40 | 005661800 650 7 L $$atähdet$$2ysa$$9FENNI 41 | 005661800 650 7 L $$atähtikartat$$2ysa$$9FENNI 42 | 005661800 650 7 L $$atähtitiede$$2ysa$$9FENNI 43 | 005661800 650 7 L $$anäyttelyt$$2ysa$$9FENNI 44 | 005661800 650 7 L $$anäyttelyjulkaisut$$2ysa$$9FENNI 45 | 005661800 650 7 L $$anäyttelyjulkaisut$$xtähtikartat$$2ysa 46 | 005661800 650 7 L $$anäyttelyt$$xtähtikartat$$2ysa 47 | 005661800 650 7 L $$atähdet$$xkartoitus$$2ysa 48 | 005661800 650 7 L $$aastronomi$$2allars 49 | 005661800 650 7 L $$autställningar$$2allars 50 | 005661800 650 7 L $$akartor$$2allars 51 | 005661800 650 7 L $$akartering$$2allars 52 | 005661800 650 7 L $$auniversum$$2allars 53 | 005661800 650 7 L $$ahimlen$$2allars 54 | 005661800 650 7 L $$astjärnbilder$$2allars 55 | 005661800 650 7 L $$astjärnor$$2allars 56 | 005661800 650 7 L $$astjärnkartor$$2allars 57 | 005661800 650 7 L $$ahistoria$$2allars 58 | 005661800 650 7 L $$autställningskataloger$$2allars 59 | 005661800 650 7 L $$ataivaankappaleet$$2kula 60 | 005661800 7102 L $$aKansalliskirjasto. 61 | 005661800 830 0 L $$aUrsan julkaisuja,$$x0357-7937 ;$$v117. 62 | 005661800 901 L $$aMU20091123$$5FENNI 63 | 005661800 908 L $$afi 64 | 005663958 FMT L BK 65 | 005663958 LDR L ^^^^^cam^a22007938i^4500 66 | 005663958 001 L 005663958 67 | 005663958 005 L 20160203005819.0 68 | 005663958 008 L 100317s2010^^^^fi^||||j^^^^^|00|^0|fin|^ 69 | 005663958 015 L $$afx938506$$2skl 70 | 005663958 020 L $$a978-952-475-377-7$$qsidottu 71 | 005663958 0243 L $$a9789524753777 72 | 005663958 0248 L $$aA1438506 73 | 005663958 035 L $$a(FI-MELINDA)005663958 74 | 005663958 0410 L $$afin 75 | 005663958 080 L $$a52$$x(024.7)$$9FENNI 76 | 005663958 080 L $$a52(024.7) 77 | 005663958 084 L $$a52.2$$2ykl$$9FENNI 78 | 005663958 1001 L $$aHeikkilä, Risto. 79 | 005663958 24510 L $$aMiksi maapallo ei putoa? /$$cRisto Heikkilä ; [kuvitus: Jari Perälä]. 80 | 005663958 260 L $$aHämeenlinna :$$bPäivä,$$c2010$$e(Hämeenlinna :$$fKariston Kirjapaino) 81 | 005663958 300 L $$a173 s. :$$bkuvitettu, karttoja ;$$c22 cm 82 | 005663958 336 L $$ateksti$$btxt$$2rdacontent 83 | 005663958 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 84 | 005663958 338 L $$anide$$bnc$$2rdacarrier 85 | 005663958 4901 L $$aAvaruus on ihmeellinen ;$$v1 86 | 005663958 500 L $$aS. 156-171: Sanasto.$$9FENNI 87 | 005663958 5050 L $$aS. 156-171: Sanasto. 88 | 005663958 650 7 L $$aavaruus$$2ysa$$9FENNI 89 | 005663958 650 7 L $$atähdet$$2ysa$$9FENNI 90 | 005663958 650 7 L $$aplaneetat$$2ysa$$9FENNI 91 | 005663958 650 7 L $$aaurinko$$2ysa$$9FENNI 92 | 005663958 650 7 L $$amaailmankaikkeus$$2ysa$$9FENNI 93 | 005663958 650 7 L $$atähtitiede$$2ysa$$9FENNI 94 | 005663958 650 7 L $$arymden$$2allars 95 | 005663958 650 7 L $$astjärnor$$2allars 96 | 005663958 650 7 L $$aplaneter$$2allars 97 | 005663958 650 7 L $$asolen$$2allars 98 | 005663958 650 7 L $$auniversum$$2allars 99 | 005663958 650 7 L $$aastronomi$$2allars 100 | 005663958 7001 L $$aPerälä, Jari,$$ekuvittaja. 101 | 005663958 830 0 L $$aAvaruus on ihmeellinen ;$$v1. 102 | 005663958 901 L $$aMU20100325$$5FENNI 103 | 005663958 908 L $$afi 104 | 006513759 FMT L BK 105 | 006513759 LDR L ^^^^^cam^a2201105^i^4500 106 | 006513759 001 L 006513759 107 | 006513759 005 L 20160215124349.0 108 | 006513759 008 L 131122s2013^^^^fi^||||j^^^^^|00|^0|fin|^ 109 | 006513759 015 L $$afx1040677$$2skl 110 | 006513759 020 L $$a978-952-5985-10-8$$qsidottu 111 | 006513759 0243 L $$a9789525985108 112 | 006513759 035 L $$a(FI-MELINDA)006513759 113 | 006513759 035 L $$z(FI-MELINDA)006396512 114 | 006513759 040 L $$aFI-NL 115 | 006513759 0411 L $$afin$$hswe 116 | 006513759 042 L $$afinb 117 | 006513759 072 7 L $$a06$$2kkaa 118 | 006513759 080 L $$a52$$x(024.7)$$9FENNI 119 | 006513759 080 L $$a52(024.7) 120 | 006513759 084 L $$a52$$2uef 121 | 006513759 084 L $$a52$$2ykl 122 | 006513759 084 L $$a52.2$$2ykl$$9FENNI 123 | 006513759 1001 L $$aValtaoja, Esko,$$ekirjoittaja. 124 | 006513759 24510 L $$aTähdenlento pöytälaatikossa ja muita taivaan tarinoita /$$c[Esko Valtaoja, Lisbeth Landefort, Tuula Moilanen] ; [Lisbeth Landefortin ruotsinkielisestä alkutekstistä suomentanut Leena Vallisaari]. 125 | 006513759 24618 L $$aTähdenlento pöytälaatikossa 126 | 006513759 2463 L $$aTähdenlento pöytälaatikossa 127 | 006513759 260 L $$a[Helsinki] :$$bTähtitieteellinen yhdistys Ursa,$$c2013$$e(Keuruulla :$$fOtavan kirjapaino). 128 | 006513759 300 L $$a52 s. :$$bkuvitettu ;$$c28 cm 129 | 006513759 336 L $$ateksti$$btxt$$2rdacontent 130 | 006513759 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 131 | 006513759 338 L $$anide$$bnc$$2rdacarrier 132 | 006513759 4901 L $$aUrsan julkaisuja,$$x0357-7937 ;$$v135 133 | 006513759 500 L $$aENNAKKOTIETO CIP/KV. 134 | 006513759 500 L $$aSelkänimeke: Tähdenlento pöytälaatikossa. 135 | 006513759 583 L $$aBTJ$$5FENNI 136 | 006513759 650 7 L $$aVintergatan$$2allars 137 | 006513759 650 7 L $$aastronomer$$2allars 138 | 006513759 650 7 L $$aastronomi$$2allars 139 | 006513759 650 7 L $$aavaruus$$2ysa$$9FENNI 140 | 006513759 650 7 L $$alinnunrata$$2ysa$$9FENNI 141 | 006513759 650 7 L $$aljusets hastighet$$2allars 142 | 006513759 650 7 L $$amaailmankaikkeus$$2ysa$$9FENNI 143 | 006513759 650 7 L $$ameteorer$$2allars 144 | 006513759 650 7 L $$ameteorit$$2ysa$$9FENNI 145 | 006513759 650 7 L $$apatsaat$$zPääsiäissaari$$2ysa 146 | 006513759 650 7 L $$aplaneetat$$2ysa$$9FENNI 147 | 006513759 650 7 L $$aplaneter$$2allars 148 | 006513759 650 7 L $$arymden$$2allars 149 | 006513759 650 7 L $$astjärnbilder$$2allars 150 | 006513759 650 7 L $$astjärnor$$2allars 151 | 006513759 650 7 L $$ataivaankappaleet$$2ysa 152 | 006513759 650 7 L $$atidvatten$$2allars 153 | 006513759 650 7 L $$atähdet$$2ysa$$9FENNI 154 | 006513759 650 7 L $$atähdistöt$$2ysa$$9FENNI 155 | 006513759 650 7 L $$atähtitiede$$2ysa$$9FENNI 156 | 006513759 650 7 L $$atähtitieteilijät$$2ysa$$9FENNI 157 | 006513759 650 7 L $$auniversum$$2allars 158 | 006513759 650 7 L $$avalonnopeus$$2ysa$$9FENNI 159 | 006513759 650 7 L $$avuorovesi$$2ysa$$9FENNI 160 | 006513759 7001 L $$aLandefort, Lisbeth,$$ekirjoittaja. 161 | 006513759 7001 L $$aLandefort, Lisbeth,$$emuu. 162 | 006513759 7001 L $$aMoilanen, Tuula,$$d1959-,$$ekirjoittaja. 163 | 006513759 7001 L $$aMoilanen, Tuula,$$ekirjoittaja. 164 | 006513759 7001 L $$aVallisaari, Leena,$$ekääntäjä. 165 | 006513759 830 0 L $$aUrsan julkaisuja,$$x0357-7937 ;$$v135. 166 | 006513759 901 L $$aMU20131125$$5FENNI 167 | -------------------------------------------------------------------------------- /test/input/punataudista.alephseq: -------------------------------------------------------------------------------- 1 | 000849320 FMT L BK 2 | 000849320 LDR L ^^^^^cam^a2200433zi^4500 3 | 000849320 001 L 000849320 4 | 000849320 005 L 20151225143859.0 5 | 000849320 008 L 961211s1915^^^^fi^|||||||||||||||||fin|| 6 | 000849320 015 L $$af459061$$2skl 7 | 000849320 035 L $$a(FI-MELINDA)000849320 8 | 000849320 040 L $$aFI-NL 9 | 000849320 0410 L $$afin 10 | 000849320 042 L $$afinb 11 | 000849320 1001 L $$aLaitinen, Johannes,$$d1869- 12 | 000849320 24510 L $$aPunataudista ja poikimakuumeesta raavaskarjassa /$$ckirjoitti J. L. 13 | 000849320 260 L $$aTampere :$$bTekijä,$$c1915. 14 | 000849320 300 L $$a12 s. 15 | 000849320 336 L $$ateksti$$btxt$$2rdacontent 16 | 000849320 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 17 | 000849320 338 L $$anide$$bnc$$2rdacarrier 18 | 000849320 530 L $$aKäytettävissä filmikortteina Kansalliskirjastossa.$$9FENNI 19 | 000849320 904 L $$at$$5FENNI 20 | -------------------------------------------------------------------------------- /test/input/raamattu.alephseq: -------------------------------------------------------------------------------- 1 | 000006629 FMT L BK 2 | 000006629 LDR L ^^^^^cam^a2200469zi^4500 3 | 000006629 001 L 000006629 4 | 000006629 005 L 20151222163524.0 5 | 000006629 008 L 841114s1984^^^^fi^|||||||||||||||||fin|| 6 | 000006629 015 L $$af843253$$2skl 7 | 000006629 035 L $$a(FI-MELINDA)000006629 8 | 000006629 040 L $$aFI-NL 9 | 000006629 0411 L $$afin$$hheb$$hgrc 10 | 000006629 042 L $$afinb 11 | 000006629 080 L $$a22$$9FENNI 12 | 000006629 1300 L $$aRaamattu. 13 | 000006629 24500 L $$aPyhä Raamattu. 14 | 000006629 260 L $$aHki :$$bSuomen pipliaseura,$$c1984$$e(Jyväskylä :$$fGummerus) 15 | 000006629 300 L $$a363 s. ;$$c22 cm 16 | 000006629 336 L $$ateksti$$btxt$$2rdacontent 17 | 000006629 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 18 | 000006629 338 L $$anide$$bnc$$2rdacarrier 19 | 000006629 500 L $$aSelkänimeke: Raamattu.$$9FENNI 20 | 000006629 5050 L $$aSisältö: Vanha testamentti : XI yleisen kirkolliskokouksen vuonna 1933 käytäntöön ottama suomennos ; Uusi testamentti : XII yleisen kirkolliskokouksen vuonna 1938 käytäntöön ottama suomennos$$9FENNI 21 | -------------------------------------------------------------------------------- /test/input/sioninwirret.alephseq: -------------------------------------------------------------------------------- 1 | 000614665 FMT L BK 2 | 000614665 LDR L 00000cam^a2200841^i^4500 3 | 000614665 001 L 000614665 4 | 000614665 005 L 20160907162435.0 5 | 000614665 008 L 971231s1802^^^^sw^|||||||||||||||||fin|^ 6 | 000614665 015 L $$afv02720$$2skl 7 | 000614665 035 L $$a(FI-MELINDA)000614665 8 | 000614665 040 L $$aFI-NL 9 | 000614665 0411 L $$afin$$hswe 10 | 000614665 042 L $$afinb 11 | 000614665 080 L $$a245$$9FENNI 12 | 000614665 080 L $$a24 13 | 000614665 1300 L $$aSionin wirret (1802) 14 | 000614665 1300 L $$aSions sånger. 15 | 000614665 24510 L $$aSionin wirret. :$$bRuotsista suomexi käätyt. 16 | 000614665 260 L $$aStockholmisa :$$bpräntätty ja ylöspandu directörin Johan A. Carlbohmin tykönä,$$cwuonna 1802. 17 | 000614665 300 L $$a[1-3] 4-398 [399-400] s. (s. [400] tyhjä) ;$$c8:o 18 | 000614665 336 L $$ateksti$$btxt$$2rdacontent 19 | 000614665 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 20 | 000614665 338 L $$anide$$bnc$$2rdacarrier 21 | 000614665 500 L $$aArkit: A-2B8.$$9FENNI 22 | 000614665 500 L $$aErrata.$$9FENNI 23 | 000614665 500 L $$aHakemisto.$$9FENNI 24 | 000614665 500 L $$aHinta: Exemplari maxa 16 skillingiä ja myydän direktörin Joh. A. Carlbohmin tykönä Stokkholmisa Regeringi-kadun wieresä Spetsin mäesa [sic] huoneesa n:o 20. Josa ne myös saadan sidottuna erinäisen hinnan edestä.$$9FENNI 25 | 000614665 500 L $$aImpr.: Niclas Hjelt. Fac. theol. not.$$9FENNI 26 | 000614665 500 L $$aMotto: Psalm. 149: 1, 2. Weisatkat Herralle uusi weisu: ..$$9FENNI 27 | 000614665 500 L $$aP: Johan Arvid Carlbohm.$$9FENNI 28 | 000614665 500 L $$aTiililän mukaan suom. Elias Lagus.$$9FENNI 29 | 000614665 500 L $$aNimiösivulla myös: [motto] Psalm. 149: 1, 2. Weisatkat Herralle uusi weisu: .. 30 | 000614665 500 L $$aPriv.: Johan Arvid Carlbohm. 31 | 000614665 500 L $$aS. [399]: [hinta] Exemplari maxa 16 skillingiä ja myydän direktörin Joh. A. Carlbohmin tykönä Stokkholmisa, Regeringi-kadun wieresä Spetsin mäesa [sic] huoneesa n:o 20. Josa ne myös saadan sidottuna erinäisen hinnan edestä. 32 | 000614665 500 L $$aS. [400] tyhjä. 33 | 000614665 504 L $$aS. [390]-398: Registeri. 34 | 000614665 5050 L $$aS. [399]: Errata 35 | 000614665 5103 L $$aPipping 1640 a. - Rämä 1626-1640 a$$9FENNI 36 | 000614665 5104 L $$aPipping$$c1640 a. 37 | 000614665 5104 L $$aRukoilevaisten kirjoja / Osmo Tiililä$$cs. 419-420. 38 | 000614665 530 L $$aMyös mikrofilmattuna kopiona Kansalliskirjastossa$$9FENNI 39 | 000614665 5611 L $$aH Reenpää: T. P. R. R., J. H. J. Johan. - s. C. I. Sio. kk/RJ. - [Heikki Reenpää].$$5HELKA 40 | 000614665 650 7 L $$avirret$$2ysa$$9FENNI 41 | 000614665 650 7 L $$ahengelliset laulut$$2ysa$$9FENNI 42 | 000614665 650 7 L $$aharvinaiskirjat$$xvirret$$2ysa 43 | 000614665 650 7 L $$aharvinaiskirjat$$xhengelliset laulut$$2ysa 44 | 000614665 650 7 L $$avirsikirjat$$y1800-1810$$2ysa 45 | 000614665 7001 L $$aLagus, Elias. 46 | 000614665 7001 L $$aLagus, Elias Gabrielsson. 47 | 000614665 7100 L $$aCarlbohm, Johan Arvid (kirjapaino, Tukholma, 1769-1812) 48 | 000614665 7100 L $$aCarlbohm, Johan Arvid$$c(Tukholma),$$nTukholma,$$ekirjap. 49 | -------------------------------------------------------------------------------- /test/input/slice.alephseq: -------------------------------------------------------------------------------- 1 | 004004500 FMT L BK 2 | 004004500 LDR L ^^^^^cam^a2200985zi^4500 3 | 004004500 001 L 004004500 4 | 004004500 005 L 20160227131800.0 5 | 004004500 008 L 971020s1997^^^^fi^|||||||||||||||||fin|| 6 | 004004500 040 L $$aFI-NL 7 | 004004500 0411 L $$afin$$heng 8 | 004004500 042 L $$afinb 9 | 004004500 1001 L $$aMcEvoy, J. P. 10 | 004004500 24010 L $$aHawking for beginners 11 | 004004500 24510 L $$aStephen Hawking vasta-alkaville ja edistyville /$$cJ. P. McEvoy ja Oscar Zarate ; [suomennos ... Jukka Vallisto]. 12 | 004004500 260 L $$aHelsinki :$$bJalava,$$c1997$$f(Hakapaino) 13 | 004004500 300 L $$a174 s. :$$bkuvitettu ;$$c21 cm 14 | 004012937 FMT L BK 15 | 004012937 LDR L ^^^^^cam^a2200793zi^4500 16 | 004012937 001 L 004012937 17 | 004041105 FMT L BK 18 | 004041105 LDR L ^^^^^cam^a2201165^i^4500 19 | 004041105 001 L 004041105 20 | 004112959 FMT L BK 21 | 004112959 LDR L ^^^^^cam^a2200973^i^4500 22 | 004112959 001 L 004112959 23 | 004113841 FMT L BK 24 | 004113841 LDR L ^^^^^cam^a2201309^i^4500 25 | 004113841 001 L 004113841 26 | 004116960 FMT L BK 27 | 004116960 LDR L ^^^^^cam^a2201357^i^4500 28 | 004116960 001 L 004116960 29 | 004117903 FMT L BK 30 | 004117903 LDR L ^^^^^cam^a2200997^i^4500 31 | 004117903 001 L 004117903 32 | 004118189 FMT L BK 33 | 004118189 LDR L 00000cam^a2200985^i^4500 34 | 004118189 001 L 004118189 35 | -------------------------------------------------------------------------------- /test/input/suoja-pirtti.alephseq: -------------------------------------------------------------------------------- 1 | 000005646 FMT L BK 2 | 000005646 LDR L 00000cam^a2200577zi^4500 3 | 000005646 001 L 000005646 4 | 000005646 005 L 20180104164905.0 5 | 000005646 008 L 820419s1981^^^^fi^|||||||||||||||||fin|| 6 | 000005646 015 L $$af820558$$2skl 7 | 000005646 035 L $$a(FI-MELINDA)000005646 8 | 000005646 040 L $$aFI-NL 9 | 000005646 0410 L $$afin 10 | 000005646 042 L $$afinb 11 | 000005646 080 L $$a361/362 12 | 000005646 080 L $$a364$$21974/fin/fennica$$9FENNI 13 | 000005646 080 L $$a613$$21974/fin/fennica$$9FENNI 14 | 000005646 080 L $$a613.81$$21974/fin/fennica$$9FENNI 15 | 000005646 080 L $$a364.65$$x-05$$x(091)$$21974/fin/fennica$$9FENNI 16 | 000005646 24500 L $$a20 vuotta päihdehuoltoa 1961-1981 /$$c[julk.] Suoja-pirti r.y. 17 | 000005646 260 L $$a[Hki] :$$bSuoja-pirtti,$$c[1981] f [Merkur] 18 | 000005646 300 L $$a[2], 33, [1] s. :$$bkuvitettu ;$$c25 cm 19 | 000005646 336 L $$ateksti$$btxt$$2rdacontent 20 | 000005646 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 21 | 000005646 338 L $$anide$$bnc$$2rdacarrier 22 | 000005646 7102 L $$aSuoja-pirtti. 23 | 000005646 7400 L $$aKaksikymmentä vuotta päihdehuoltoa 1961-1981. 24 | 000005646 903 L $$ab$$5FENNI 25 | 000005646 904 L $$ap$$5FENNI 26 | -------------------------------------------------------------------------------- /test/input/superkumikana-cd.alephseq: -------------------------------------------------------------------------------- 1 | 006117999 FMT L MU 2 | 006117999 LDR L ^^^^^cim^a2200649^i^4500 3 | 006117999 001 L 006117999 4 | 006117999 005 L 20160206012936.0 5 | 006117999 007 L sd^f||g|||m||| 6 | 006117999 008 L 121016s2012^^^^fi^||||j^||||||f|^|^fin|^ 7 | 006117999 015 L $$afx1004905$$2skl 8 | 006117999 020 L $$a978-951-692-933-3$$qCD-äänilevy 9 | 006117999 0243 L $$a9789516929333 10 | 006117999 035 L $$a(FI-MELINDA)006117999 11 | 006117999 040 L $$aFI-NL 12 | 006117999 0410 L $$dfin 13 | 006117999 042 L $$afinb 14 | 006117999 080 L $$a894.541$$x-3$$x(024.7)$$9FENNI 15 | 006117999 084 L $$a84.2$$2ykl 16 | 006117999 1001 L $$aMäki, Harri István 17 | 006117999 24510 L $$aSuperkumikana /$$cHarri István Mäki. 18 | 006117999 260 L $$a[Kärkölä] :$$bPieni Karhu ;$$a[Helsinki] :$$bjakelija: BTJ Finland,$$ccop. 2012$$e([Helsinki] :$$fCD Data-Mate) 19 | 006117999 300 L $$a2 CD-äänilevyä (1 h 31 min)$$fkotelossa$$g14 x 14 x 2 cm. 20 | 006117999 336 L $$apuhe$$bspw$$2rdacontent 21 | 006117999 337 L $$aaudio$$bs$$2rdamedia 22 | 006117999 338 L $$aäänilevy$$bsd$$2rdacarrier 23 | 006117999 4900 L $$aBTJ äänikirjat. Lasten- ja nuortenkirjallisuus 24 | 006117999 500 L $$aÄänikirja (painettu laitos Pieni Karhu, 2011)$$9FENNI 25 | 006117999 5110 L $$aLukija: Pinja Flink.$$9FENNI 26 | 006117999 60004 L $$aSuperkumikana,$$c(fiktiivinen hahmo) 27 | 006117999 650 7 L $$alastenkirjallisuus$$2kaunokki 28 | 006117999 650 7 L $$aäänikirjat$$2kaunokki 29 | 006117999 650 7 L $$aseikkailu$$2kaunokki 30 | 006117999 650 7 L $$arohkeus$$2kaunokki 31 | 006117999 650 7 L $$asalaisuudet$$xtalot$$2kaunokki 32 | 006117999 650 7 L $$aaarteet$$2kaunokki 33 | 006117999 650 7 L $$ajuhlat$$xHalloween$$2kaunokki 34 | 006117999 650 7 L $$ajengit$$xNokkakopla$$2kaunokki 35 | 006117999 650 7 L $$akoti$$xkummitukset$$2kaunokki 36 | 006117999 7001 L $$aFlink, Pinja,$$d1975-,$$eesittäjä,$$elukija. 37 | 006117999 830 0 L $$aBTJ äänikirjat.$$pLasten- ja nuortenkirjallisuus. 38 | -------------------------------------------------------------------------------- /test/input/titlepart.alephseq: -------------------------------------------------------------------------------- 1 | 000770276 FMT L BK 2 | 000770276 LDR L ^^^^^cam^a22004692i^4500 3 | 000770276 001 L 000770276 4 | 000770276 005 L 20151225091803.0 5 | 000770276 008 L 940713s1950^^^^fi^|||||||||||||||d|fin|| 6 | 000770276 015 L $$af535310$$2skl 7 | 000770276 035 L $$a(FI-MELINDA)000770276 8 | 000770276 040 L $$aFI-NL 9 | 000770276 0410 L $$afin 10 | 000770276 042 L $$afinb 11 | 000770276 080 L $$a894.541$$x-2$$9FENNI 12 | 000770276 1001 L $$aKivi, Aleksis,$$d1834-1872. 13 | 000770276 24510 L $$aKootut teokset.$$n3,$$pNäytelmiä: Olviretki Schleusingenissä ; Leo ja Liisa ; Canzino ; Selman juonet ; Alma /$$cAleksis Kivi ; julk. E. A. Saarimaa. 14 | 000770276 250 L $$a4. p. 15 | 000770276 260 L $$aHelsinki :$$bSuomalaisen kirjallisuuden seura,$$c1950. 16 | 000770276 300 L $$aX, [2], 518, [3] s. ;$$c8:o 17 | 000770276 336 L $$ateksti$$btxt$$2rdacontent 18 | 000770276 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 19 | 000770276 338 L $$anide$$bnc$$2rdacarrier 20 | 000770276 4901 L $$aSuomalaisen Kirjallisuuden Seuran toimituksia,$$x0355-1768 ;$$v138 osa 21 | 000770276 563 L $$aSidottu. 22 | 000770276 7001 L $$aSaarimaa, E. A. 23 | 000770276 7400 L $$aNäytelmiä. 24 | 000770276 830 0 L $$aSuomalaisen Kirjallisuuden Seuran toimituksia,$$x0355-1768 ;$$v138 osa. 25 | 000779229 FMT L BK 26 | 000779229 LDR L ^^^^^cam^a2200553^i^4500 27 | 000779229 001 L 000779229 28 | 000779229 005 L 20151215004854.0 29 | 000779229 008 L 941020s1921^^^^fi^|||||||||||||||j|fin|^ 30 | 000779229 015 L $$af543958$$2skl 31 | 000779229 035 L $$a(FI-MELINDA)000779229 32 | 000779229 040 L $$aFI-NL 33 | 000779229 0410 L $$afin 34 | 000779229 042 L $$afinb 35 | 000779229 080 L $$a894.541$$x-3$$9FENNI 36 | 000779229 080 L $$a894.541$$x-32 37 | 000779229 1001 L $$aAho, Juhani. 38 | 000779229 24510 L $$aKootut lastut.$$n1 /$$cJuhani Aho. 39 | 000779229 260 L $$aPorvoossa :$$bWSOY,$$c1921$$e(Porvoossa :$$fWSOY) 40 | 000779229 300 L $$a573 s. ;$$c8:o 41 | 000779229 336 L $$ateksti$$btxt$$2rdacontent 42 | 000779229 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 43 | 000779229 338 L $$anide$$bnc$$2rdacarrier 44 | 000779229 500 L $$aLisäpainokset: 2. p. 1947. - 3. p. 1948. - 4. p. 1951.$$9FENNI 45 | 000779229 500 L $$aMuutamia alkuperäiskokoelmiin (Lastuja 1, 1891 ; Uusia lastuja, 1894 ; Lastuja 3, 1896) sis. novelleja on jätetty tästä kokoelmasta pois.$$9FENNI 46 | 000779229 5050 L $$aLastuja, kokoelma 1: Uudisasukas ; Kosteikko, kukkula, saari ; Mallikelpoinen ; Hääpäivänä ; Kerran konsertissa ; Kotiin ; Maan sydämeen ; Isäntä ja mökkiläinen ; Idän halla ; Kurjalan rannalla ; Alakuloisuuden ylistys ; Vanha valkama ; Vanha laulaja ; Purjeita kuivaamassa ; Surullinen tarina jäniksenpojasta ; Iloinen tarina jäniksestä ja pojasta ; Haltian joululahjat ; Hirvi ; Jumalan luomia ; Pyhitetyt pyydysmetsät ; Jumalan lintu ; Metsämiehen muistelma ; Taikuri ; Kohtaus oikeuden istunnossa ; Näköhäiriö ; Uskollinen ; Viimeinen rakkauteni ; Kaksin ; Nuoruuden unelma. - Uusia lastuja: Kevätkylmät ; Joulu ; Kevät ja kesä ; Syysmyrsky ; Kesäinen unelma ; Sasu Punanen ; Aave ; Rakkauden kirje ; Ruokarouva ; Helsinkiin ; Vastamyrkky ; Vanha nuorimies ; Mennyttä kalua ; "Oi, jos oisin virkamies" ; Vanha muisto ; Salaperäinen tarina ; Urotyö ; "Hätääkärsivien hyväksi" ; Taiteilija, joka oli maalannut paljaan naisen ; Hyppäys toiseen maailmaan ; Kotoinen kylyni ; Onnelani. - Lastuja, kokoelma 3: Isien puu ; Kaukana ja korkealla ; Kevään kevät ; Synkän korven sydämeen ; Syyskuun kesä ; Syksyllä ; Imatralla ; Rautatiejunassa ; Suurin totuus ; Kuvain kumartaja ; Ihmisen pelko ; Pienehkö, pyöreä, pehmeähkö ; Nuori sielu ; Oman onnensa seppä ; Yhdistysten aikakaudella ; Liian suuria miehiä ; Liisan lehmä ; Naimajuttu ; Kujeelan Matti ; "Nyt ne tulee!" ; Viimeinen ponnistus ; Koulumuistoja ; Unholaan ; Hätä ; Kielletty hedelmä ; Ilkityö ; Hula ; Hektor II ; Mullikka ; Verikaste ; Väinämöisen kantele ; Sovintojuhla ; Sydänmaankylän kansakoulu ; Juhannus ; Tuulien käänteissä ; Miten tahtoisin elää ja miten kuolla$$9FENNI 47 | 000779229 5611 L $$aH Reenpää: [Heikki Reenpää].$$5HELKA 48 | 000779229 650 7 L $$asuomenkielinen kirjallisuus$$xnovellit$$y1890-1910-luku$$2ysa 49 | 000779229 650 7 L $$akertomakirjallisuus$$2ysa 50 | 000779229 650 7 L $$aromaanit$$xkootut teokset$$2ysa 51 | 000779229 7400 L $$aLastuja. 52 | 000779229 7400 L $$aUusia lastuja. 53 | 000779573 FMT L BK 54 | 000779573 LDR L ^^^^^cam^a2200337zi^4500 55 | 000779573 001 L 000779573 56 | 000779573 005 L 20151225102540.0 57 | 000779573 008 L 941024s1947^^^^fi^|||||||||||||||f|fin|| 58 | 000779573 015 L $$af544977$$2skl 59 | 000779573 035 L $$a(FI-MELINDA)000779573 60 | 000779573 040 L $$aFI-NL 61 | 000779573 0411 L $$afin$$hita 62 | 000779573 042 L $$afinb 63 | 000779573 080 L $$a850$$x-3$$9FENNI 64 | 000779573 1001 L $$aBoccaccio, Giovanni. 65 | 000779573 24510 L $$aDekamerone.$$pNeljäs päivä ja siihen kuuluvat 10 kertomusta /$$cBoccaccio ; saksalaisesta painoksesta suom. Anja Elenius-Pantzopoulos. 66 | 000779573 260 L $$aTurku :$$bLukumies,$$c1947. 67 | 000779573 300 L $$a[2], 92 s. ;$$c8:o 68 | 000779573 336 L $$ateksti$$btxt$$2rdacontent 69 | 000779573 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 70 | 000779573 338 L $$anide$$bnc$$2rdacarrier 71 | 000779573 7001 L $$aElenius-Pantzopoulos, Anja. 72 | 000779573 7400 L $$aNeljäs päivä ja siihen kuuluvat 10 kertomusta. 73 | -------------------------------------------------------------------------------- /test/input/trauma.alephseq: -------------------------------------------------------------------------------- 1 | 000727468 FMT L BK 2 | 000727468 LDR L 00000cam^a22004932i^4500 3 | 000727468 001 L 000727468 4 | 000727468 005 L 20170122080133.0 5 | 000727468 008 L 920318s1975^^^^fi^|||||||||||||||d|fin|| 6 | 000727468 015 L $$afx291592$$2skl 7 | 000727468 020 L $$a951-30-3333-3$$qnidottu 8 | 000727468 035 L $$a(FI-MELINDA)000727468 9 | 000727468 035 L $$z(FI-MELINDA)003302436 10 | 000727468 040 L $$aFI-NL 11 | 000727468 0411 L $$afin$$heng 12 | 000727468 042 L $$afinb 13 | 000727468 080 L $$a820 14 | 000727468 080 L $$a820$$x-2$$9FENNI 15 | 000727468 084 L $$a83.2$$2ykl 16 | 000727468 1001 L $$aShakespeare, William. 17 | 000727468 24010 L $$aKing Lear 18 | 000727468 24510 L $$aKuningas Lear /$$cWilliam Shakespeare ; suom. Matti Rossi ; saatesanat: Kalle Holmberg. 19 | 000727468 260 L $$aHelsinki :$$bTammi,$$c1975$$f(KK) 20 | 000727468 300 L $$a162, [1] s., 4 kuvalehteä :$$bkuvitettu 21 | 000727468 336 L $$ateksti$$btxt$$2rdacontent 22 | 000727468 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 23 | 000727468 338 L $$anide$$bnc$$2rdacarrier 24 | 000727468 4901 L $$aKurki-kirja$$9FENNI 25 | 000727468 650 7 L $$akaunokirjallisuus$$xsuomenkielinen kirjallisuus$$2ysa 26 | 000727468 650 7 L $$askönlitteratur$$xfinsk litteratur$$2allars 27 | 000727468 653 L $$anäytelmät$$aenglannin kieli$$asuomenkielinen käännös 28 | 000727468 653 L $$askådespel$$aengelska$$afinsk översättning 29 | 000727468 7001 L $$aHolmberg, Kalle,$$d1939-2016 30 | 000727468 7001 L $$aRossi, Matti,$$d1934- 31 | 000727468 830 0 L $$aKurki-kirja.$$9FENNI 32 | 000727468 908 L $$axxk 33 | 000727468 908 L $$agb 34 | 005838226 FMT L BK 35 | 005838226 LDR L ^^^^^cam^a2201297^i^4500 36 | 005838226 001 L 005838226 37 | 005838226 005 L 20170124054323.0 38 | 005838226 008 L 110308s2010^^^^fi^||||^^m^^^|00|^0|eng|^ 39 | 005838226 015 L $$afx964428$$2skl 40 | 005838226 020 L $$a978-952-476-320-2$$qnidottu 41 | 005838226 035 L $$a(FI-MELINDA)005838226 42 | 005838226 040 L $$aFI-NL 43 | 005838226 0410 L $$aeng$$bfin$$bswe 44 | 005838226 042 L $$afinb 45 | 005838226 072 7 L $$a87$$2kkaa 46 | 005838226 080 L $$a820.01 47 | 005838226 080 L $$a82$$9FENNI 48 | 005838226 084 L $$a86.53$$2ykl 49 | 005838226 084 L $$a86.5$$2ykl 50 | 005838226 1001 L $$aRodi-Risberg, Marinella. 51 | 005838226 24510 L $$aWriting trauma, writing time and space :$$bJane Smiley's A Thousand Acres and the Lear group of father-daughter incest narratives /$$cMarinella Rodi-Risberg. 52 | 005838226 260 L $$aVaasa :$$bVaasan yliopisto,$$c2010$$e([Tampere] :$$fTampereen Yliopistopaino) 53 | 005838226 300 L $$aXII, 305 s. ;$$c25 cm 54 | 005838226 336 L $$ateksti$$btxt$$2rdacontent 55 | 005838226 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 56 | 005838226 338 L $$anide$$bnc$$2rdacarrier 57 | 005838226 4901 L $$aActa Wasaensia,$$x0355-2667 ;$$vno. 229 58 | 005838226 4901 L $$aActa Wasaensia. Literary and cultural studies. English$$x1795-7494 ;$$v5 59 | 005838226 4901 L $$aActa Wasaensia,$$x0355-2667 ;$$v229 60 | 005838226 502 L $$aVäitöskirja :$$cVaasan yliopisto - University of Vaasa. 61 | 005838226 502 L $$aVäitöskirja :$$cVaasan yliopisto.$$9FENNI 62 | 005838226 520 L $$aSammandrag: Att skriva trauma, att skriva tid och rum : Jane Smileys A Thousand Acres och gruppen Kung Lear -berättelser som far-dotter-incest.$$9FENNI 63 | 005838226 520 L $$aTiivistelmä: Trauman, ajan ja tilan kirjoittaminen : Jane Smileyn A Thousand Acres -romaani ja King Lear -ryhmän isän ja tyttären väliset insestikertomukset. 64 | 005838226 520 L $$aTiivistelmä: Trauman, ajan ja tilan kirjoittaminen : Jane Smileyn A Thousand Acres-romaanin ja King Lear -ryhmän isän ja tyttären väliset insestikertomukset.$$9FENNI 65 | 005838226 520 L $$aSammandrag: Att skriva trauma, att skriva tid och rum : Jane Smileys A Thousand Acres och gruppen Kung Lear -berättelser om far-dotter-incest. 66 | 005838226 530 L $$aJulkaistu myös verkkoaineistona. 67 | 005838226 579 L $$aXLUETTELOITU$$bhelka 68 | 005838226 579 L $$aXLUETTELOITU$$btrito 69 | 005838226 60010 L $$aLear, King (Legendary character) in literature. 70 | 005838226 60014 L $$aMiner, Valerie. Walking fire. 71 | 005838226 60014 L $$aTyler, Anne.$$tLadder of years.$$9FENNI 72 | 005838226 60014 L $$aTyler, Anne.$$tElämän tikapuilla.$$9FENNI 73 | 005838226 60014 L $$aMiner, Valerie.$$tA walking fire.$$9FENNI 74 | 005838226 60014 L $$aMacInnes, Mairi.$$tThe quondam wives.$$9FENNI 75 | 005838226 60014 L $$aEsquivel, Laura.$$tComo agua para chocolate.$$9FENNI 76 | 005838226 60014 L $$aEsquivel, Laura.$$tPöytään ja vuoteeseen.$$9FENNI 77 | 005838226 60014 L $$aEllmann, Lucy.$$tSweet desserts.$$9FENNI 78 | 005838226 60014 L $$aAtwood, Margaret.$$tCat's eye.$$9FENNI 79 | 005838226 60014 L $$aAtwood, Margaret.$$tKissansilmä.$$9FENNI 80 | 005838226 60014 L $$aShakespeare, William.$$tKing Lear.$$9FENNI 81 | 005838226 60014 L $$aShakespeare, William.$$tKuningas Lear.$$9FENNI 82 | 005838226 60014 L $$aSmiley, Jane.$$tA thousand acres.$$9FENNI 83 | 005838226 650 7 L $$aekokritiikki$$2ysa$$9FENNI 84 | 005838226 650 7 L $$akirjallisuudentutkimus$$2ysa$$9FENNI 85 | 005838226 650 7 L $$akansantarinat$$2ysa$$9FENNI 86 | 005838226 650 7 L $$akaunokirjallisuus$$2ysa$$9FENNI 87 | 005838226 650 7 L $$atyttäret$$2ysa$$9FENNI 88 | 005838226 650 7 L $$aisät$$2ysa$$9FENNI 89 | 005838226 650 7 L $$ainsesti$$xtyttäret$$xisät$$xkirjallisuus$$2ysa 90 | 005838226 650 7 L $$atraumat$$xkaunokirjallisuus$$2ysa 91 | 005838226 650 7 L $$alitteraturvetenskap$$2ysa 92 | 005838226 650 7 L $$ainsesti$$2ysa$$9FENNI 93 | 005838226 650 7 L $$aenglanninkielinen kirjallisuus$$2ysa$$9FENNI 94 | 005838226 650 7 L $$atraumat$$2ysa$$9FENNI 95 | 005838226 650 7 L $$aintertekstuaalisuus$$2ysa$$9FENNI 96 | 005838226 650 7 L $$aekokritik$$2allars 97 | 005838226 650 7 L $$aengelskspråkig litteratur$$2allars 98 | 005838226 650 7 L $$aintertextualitet$$2allars 99 | 005838226 650 7 L $$atrauman$$2allars 100 | 005838226 650 7 L $$aincest$$2allars 101 | 005838226 650 7 L $$aromaani$$xintertekstuaalisuus$$2kitu 102 | 005838226 650 7 L $$akertomusperinne$$xinsesti$$2kula 103 | 005838226 650 7 L $$akaunokirjallisuus$$xaiheet$$xinsesti$$2kitu 104 | 005838226 650 7 L $$akirjallisuudentutkimus$$xekokritiikki$$2kitu 105 | 005838226 650 7 L $$akansansadut$$xinsesti$$2kula 106 | 005838226 650 0 L $$aEcocriticism in literature. 107 | 005838226 650 0 L $$aPsychic trauma in literature. 108 | 005838226 60014 L $$aSmiley, Jane,$$cA thousand acres. 109 | 005838226 60014 L $$aShakespeare, William,$$cKuningas Lear. 110 | 005838226 650 7 L $$akirjallisuus$$xinsesti$$2ysa 111 | 005838226 650 7 L $$akirjallisuus$$xtraumat$$2ysa 112 | 005838226 650 7 L $$aekokritiikki$$xKuningas Lear$$2ysa 113 | 005838226 650 7 L $$aisät$$xtyttäret$$xinsesti$$2ysa 114 | 005838226 830 0 L $$aActa Wasaensia,$$x0355-2667 ;$$vno. 229. 115 | 005838226 830 0 L $$aActa Wasaensia.$$pKirjallisuuden- ja kulttuurintutkimus,$$x1795-7494 ;$$v5. 116 | 005838226 85641 L $$uhttp://www.uwasa.fi/materiaali/pdf/isbn_978-952-476-320-2.pdf 117 | 005838226 830 0 L $$aActa Wasaensia,$$x0355-2667 ;$$v229. 118 | 005838226 830 0 L $$aActa Wasaensia. Literary and cultural studies. English,$$x1795-7494 ;$$v5. 119 | 005838226 901 L $$aMU20110317$$5FENNI 120 | 005838226 908 L $$afin 121 | -------------------------------------------------------------------------------- /test/input/tukreidbol.alephseq: -------------------------------------------------------------------------------- 1 | 004432056 FMT L BK 2 | 004432056 LDR L 02867cam^a2200757zi^4500 3 | 004432056 001 L 004432056 4 | 004432056 005 L 20190704064208.0 5 | 004432056 008 L 900802s1989^^^^hu^|||||||||||||||p|hun|| 6 | 004432056 015 L $$afx188203$$2skl 7 | 004432056 020 L $$a963-07-4869-X$$qnidottu 8 | 004432056 035 L $$a(FI-MELINDA)004432056 9 | 004432056 040 L $$aFI-NL 10 | 004432056 0411 L $$ahun$$hfin 11 | 004432056 042 L $$afinb 12 | 004432056 080 L $$a894.541$$x-1$$9FENNI 13 | 004432056 080 L $$a894.541$$x-1$$x=945.11 14 | 004432056 084 L $$a82.21$$2ykl$$9FENNI 15 | 004432056 1001 L $$aNummi, Lassi,$$d1928-2012.$$0(FIN11)000053753 16 | 004432056 24510 L $$aLépj ki tükreidböl /$$cLassi Nummi ; [válogatta és az utószót írta Jávorszky Béla] ; [fordítta Csoóri Sándor, Jávorszky Béla, Szopori Nagy Lajos, Tornai József]. 17 | 004432056 260 L $$aBudapest :$$bEurópa,$$c1989. 18 | 004432056 300 L $$a114 s. ;$$c18 cm 19 | 004432056 336 L $$ateksti$$btxt$$2rdacontent 20 | 004432056 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 21 | 004432056 338 L $$anide$$bnc$$2rdacarrier 22 | 004432056 4900 L $$aNapjaink költészete,$$x0133-4050 23 | 004432056 500 L $$aKäännetty useista alkuteoksista.$$9FENNI 24 | 004432056 650 7 L $$aunkarinkielinen kirjallisuus$$2yso/fin$$0http://www.yso.fi/onto/yso/p19592 25 | 004432056 650 7 L $$aungersk litteratur$$2yso/swe$$0http://www.yso.fi/onto/yso/p19592 26 | 004432056 655 7 L $$akaunokirjallisuus$$2slm/fin$$0http://urn.fi/URN:NBN:fi:au:slm:s975 27 | 004432056 655 7 L $$askönlitteratur$$2slm/swe$$0http://urn.fi/URN:NBN:fi:au:slm:s975 28 | 004432056 7001 L $$aJávorszky, Béla,$$d1940-$$0(FIN11)000046031 29 | 004432056 7001 L $$aCsoóri, Sándor. 30 | 004432056 7001 L $$aSzopori Nagy, Lajos.$$0(FIN11)000060187 31 | 004432056 7001 L $$aTornai, József. 32 | 004432056 9001 L $$aNagy, Lajos Szopori$$ySzopori Nagy, Lajos 33 | 004432056 903 L $$ac$$5FENNI 34 | -------------------------------------------------------------------------------- /test/input/tvennekomedier.alephseq: -------------------------------------------------------------------------------- 1 | 000347423 FMT L BK 2 | 000347423 LDR L 00000cam^a2200481^i^4500 3 | 000347423 001 L 000347423 4 | 000347423 005 L 20170119120043.0 5 | 000347423 008 L 030506s1877^^^^sw^||||^^^^^^^|0|^ddswe|^ 6 | 000347423 015 L $$af20030884$$2skl 7 | 000347423 035 L $$a(FI-MELINDA)000347423 8 | 000347423 040 L $$aFI-NL$$bfin$$erda 9 | 000347423 0410 L $$aswe 10 | 000347423 042 L $$afinb 11 | 000347423 080 L $$a839.7$$x-2$$9FENNI 12 | 000347423 1001 L $$aChronander, Jacob Pettersson,$$dsyntynyt ehkä 1620-luvulla, kuollut 1694,$$ekirjoittaja. 13 | 000347423 24510 L $$aTvenne komedier /$$caf Jacobus Petri Chronander ; ånyo utgifna af P. Hanselli. 14 | 000347423 264 1 L $$a[Upsala] :$$b[P. Hanselli],$$c[1877] 15 | 000347423 264 3 L $$aUpsala :$$bP. Hanselli,$$c1877. 16 | 000347423 300 L $$aIV, 200 sivua ;$$c8:o 17 | 000347423 336 L $$ateksti$$btxt$$2rdacontent 18 | 000347423 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 19 | 000347423 338 L $$anide$$bnc$$2rdacarrier 20 | 000347423 500 L $$aEripainos: Samlade vitterhetsarbeten af svenska författare från Stjernhjelm till Dalin. Del 21. 1876.$$9FENNI 21 | 000347423 50500 L $$tSurge eller Flijt- och oflijlighetz skode-spegel$$gsivut 1-91.$$tBele-snack eller Een ny comœdia$$gsivut 93-200.$$9FENNI 22 | 000347423 650 7 L $$aruotsinkielinen kirjallisuus$$xnäytelmät$$y1870-luku$$2ysa 23 | 000347423 655 7 L $$anäytelmät$$2ysa$$9FENNI 24 | 000347423 70012 L $$iSisältää (teos):$$aChronander, Jacob Pettersson,$$dsyntynyt ehkä 1620-luvulla, kuollut 1694,$$ekirjoittaja.$$tSurge. 25 | 000347423 70012 L $$iSisältää (teos):$$aChronander, Jacob Pettersson,$$dsyntynyt ehkä 1620-luvulla, kuollut 1694,$$ekirjoittaja.$$tBele-snack. 26 | 000347423 7001 L $$aHanselli, Per,$$eesipuheen kirjoittaja. 27 | 000347423 960 L $$aKirjahistoria$$9FENNI 28 | -------------------------------------------------------------------------------- /test/input/verkkoaineisto.alephseq: -------------------------------------------------------------------------------- 1 | 006089019 FMT L BK 2 | 006089019 LDR L 06618cam^a2201285^i^4500 3 | 006089019 001 L 006089019 4 | 006089019 005 L 20190704010949.0 5 | 006089019 008 L 130204s2012^^^^fi^||||^^m^^^|00|^0|eng|^ 6 | 006089019 015 L $$afx1013570$$2skl 7 | 006089019 020 L $$a978-951-39-4907-5$$qnidottu 8 | 006089019 035 L $$a(FI-MELINDA)006089019 9 | 006089019 040 L $$aFI-NL 10 | 006089019 0410 L $$aeng$$bfin 11 | 006089019 042 L $$afinb 12 | 006089019 072 7 L $$a43$$2kkaa 13 | 006089019 080 L $$a069$$21974/fin/fennica$$9FENNI 14 | 006089019 080 L $$a004$$21974/fin/fennica$$9FENNI 15 | 006089019 080 L $$a008$$21974/fin/fennica$$9FENNI 16 | 006089019 084 L $$a06.2$$2ykl 17 | 006089019 1001 L $$aHäyrinen, Ari. 18 | 006089019 24510 L $$aOpen sourcing digital heritage :$$bdigital surrogates, museums and knowledge management in the age of open networks /$$cAri Häyrinen. 19 | 006089019 260 L $$aJyväskylä :$$bUniversity of Jyväskylä,$$c2012$$e(Jyväskylä :$$fJyväskylä University Printing House) 20 | 006089019 300 L $$a132, [42] s. :$$bkuvitettu ;$$c25 cm 21 | 006089019 336 L $$ateksti$$btxt$$2rdacontent 22 | 006089019 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 23 | 006089019 338 L $$anide$$bnc$$2rdacarrier 24 | 006089019 4901 L $$aJyväskylä studies in humanities,$$x1459-4323 ;$$v187 25 | 006089019 500 L $$aArtikkeliväitöskirjan yhteenveto-osa ja 4 eripainosta.$$9FENNI 26 | 006089019 502 L $$aVäitöskirja :$$cJyväskylän yliopisto, humanistinen tiedekunta, digitaalinen kulttuuri. 27 | 006089019 502 L $$aVäitöskirja :$$cJyväskylän yliopisto.$$9FENNI 28 | 006089019 5052 L $$aOriginal papers: PI Memories in the warehouse : developing a multiperspective information system for culture historical use -- PII A template based, event-centric documentation framework -- PIII Towards semantic modelling of cultural historical data -- P IV Google, world's largest museum? 29 | 006089019 520 L $$aYhteenveto (Finnish summary)$$9FENNI 30 | 006089019 5208 L $$aYhteenveto. 31 | 006089019 530 L $$aJulkaistu myös verkkoaineistona ISBN 978-951-39-4908-2 (PDF)$$9FENNI 32 | 006089019 579 L $$aXLUETTELOITU$$bjykdo 33 | 006089019 650 7 L $$akulttuuriperintö$$2yso/fin$$0http://www.yso.fi/onto/yso/p8475$$9FENNI 34 | 006089019 650 7 L $$adigitaalinen tallennus$$2yso/fin$$0http://www.yso.fi/onto/yso/p14221$$9FENNI 35 | 006089019 650 7 L $$adigitointi$$2yso/fin$$0http://www.yso.fi/onto/yso/p23839$$9FENNI 36 | 006089019 650 7 L $$averkkoaineisto$$2yso/fin$$0http://www.yso.fi/onto/yso/p24267$$9FENNI 37 | 006089019 650 7 L $$aaineistot$$2yso/fin$$0http://www.yso.fi/onto/yso/p6546$$9FENNI 38 | 006089019 650 7 L $$akokoelmat$$2yso/fin$$0http://www.yso.fi/onto/yso/p12676$$9FENNI 39 | 006089019 650 7 L $$aavoin tieto$$2yso/fin$$0http://www.yso.fi/onto/yso/p26655$$9FENNI 40 | 006089019 650 7 L $$aopen access$$2yso/fin$$0http://www.yso.fi/onto/yso/p17649$$9FENNI 41 | 006089019 650 7 L $$amuseot$$2yso/fin$$0http://www.yso.fi/onto/yso/p4934$$9FENNI 42 | 006089019 650 7 L $$amuistiorganisaatiot$$2yso/fin$$0http://www.yso.fi/onto/yso/p21159$$9FENNI 43 | 006089019 650 7 L $$atietojärjestelmät$$2yso/fin$$0http://www.yso.fi/onto/yso/p3927$$9FENNI 44 | 006089019 650 7 L $$averkkojulkaiseminen$$2yso/fin$$0http://www.yso.fi/onto/yso/p18440 45 | 006089019 650 7 L $$aavoin lähdekoodi$$2yso/fin$$0http://www.yso.fi/onto/yso/p17089 46 | 006089019 650 7 L $$ayhdistetty avoin tieto$$2yso/fin$$0http://www.yso.fi/onto/yso/p26001 47 | 006089019 650 7 L $$akulturarv$$2yso/swe$$0http://www.yso.fi/onto/yso/p8475 48 | 006089019 650 7 L $$adigital lagring$$2yso/swe$$0http://www.yso.fi/onto/yso/p14221 49 | 006089019 650 7 L $$adigitalisering (verksamhet)$$2yso/swe$$0http://www.yso.fi/onto/yso/p23839 50 | 006089019 650 7 L $$ainternetmaterial$$2yso/swe$$0http://www.yso.fi/onto/yso/p24267 51 | 006089019 650 7 L $$amaterial (stoff)$$2yso/swe$$0http://www.yso.fi/onto/yso/p6546 52 | 006089019 650 7 L $$asamlingar$$2yso/swe$$0http://www.yso.fi/onto/yso/p12676 53 | 006089019 650 7 L $$aöppen data$$2yso/swe$$0http://www.yso.fi/onto/yso/p26655 54 | 006089019 650 7 L $$aopen access$$2yso/swe$$0http://www.yso.fi/onto/yso/p17649 55 | 006089019 650 7 L $$amuseer$$2yso/swe$$0http://www.yso.fi/onto/yso/p4934 56 | 006089019 650 7 L $$aminnesorganisationer$$2yso/swe$$0http://www.yso.fi/onto/yso/p21159 57 | 006089019 650 7 L $$ainformationssystem$$2yso/swe$$0http://www.yso.fi/onto/yso/p3927 58 | 006089019 650 7 L $$awebbpublicering$$2yso/swe$$0http://www.yso.fi/onto/yso/p18440 59 | 006089019 650 7 L $$aöppen källkod$$2yso/swe$$0http://www.yso.fi/onto/yso/p17089 60 | 006089019 650 7 L $$alänkade öppna data$$2yso/swe$$0http://www.yso.fi/onto/yso/p26001 61 | 006089019 653 L $$adigitaalinen kulttuuriperintö 62 | 006089019 653 0 L $$adigital heritage 63 | 006089019 653 0 L $$aopen source 64 | 006089019 653 0 L $$aopen data 65 | 006089019 653 0 L $$averkkoaineistot 66 | 006089019 655 7 L $$aväitöskirjat$$2slm/fin$$0http://urn.fi/URN:NBN:fi:au:slm:s1227 67 | 006089019 655 7 L $$adoktorsavhandlingar$$2slm/swe$$0http://urn.fi/URN:NBN:fi:au:slm:s1227 68 | 006089019 7400 L $$aMemories in the warehouse : developing a multiperspective information system for culture historical use 69 | 006089019 7402 L $$aA template based, event-centric documentation framework 70 | 006089019 7400 L $$aTowards semantic modelling of cultural historical data 71 | 006089019 7400 L $$aGoogle, world's largest museum? 72 | 006089019 77608 L $$iVerkkoaineisto:$$aHäyrinen, Ari.$$tOpen sourcing digital heritage : digital surrogates, museums and knowledge management in the age of open networks$$z978-951-39-4908-2 73 | 006089019 830 0 L $$aJyväskylä studies in humanities,$$x1459-4323 ;$$v187. 74 | 006089019 85641 L $$uhttp://urn.fi/URN:ISBN:978-951-39-4908-2$$yLinkki verkkoaineistoon 75 | 006089019 901 L $$aMU20130322$$5FENNI 76 | -------------------------------------------------------------------------------- /test/input/vesijohtolaitos.alephseq: -------------------------------------------------------------------------------- 1 | 007336990 FMT L BK 2 | 007336990 LDR L ^^^^^cam^a2200973zi^4500 3 | 007336990 001 L 007336990 4 | 007336990 005 L 20160105111132.0 5 | 007336990 008 L 150818s1938^^^^fi^|||||||||||||||||fin|| 6 | 007336990 015 L $$af498577$$2skl 7 | 007336990 035 L $$z(FI-MELINDA)007070756 8 | 007336990 035 L $$z(FI-MELINDA)005336295 9 | 007336990 035 L $$z(FI-MELINDA)005336294 10 | 007336990 035 L $$z(FI-MELINDA)000820219 11 | 007336990 035 L $$a(FI-MELINDA)007336990 12 | 007336990 040 L $$aFI-NL 13 | 007336990 0410 L $$afin 14 | 007336990 042 L $$afinb 15 | 007336990 080 L $$a908 Helsinki 16 | 007336990 080 L $$a628.1$$x(480.1) 17 | 007336990 080 L $$a628 18 | 007336990 080 L $$a556 19 | 007336990 080 L $$a502/504 20 | 007336990 084 L $$a62$$2ykl 21 | 007336990 1001 L $$aLilja, John L. W.,$$q(John Lennart Woldemar Lillja),$$d1879-1946,$$ekirjoittaja. 22 | 007336990 24510 L $$aHelsingin kaupungin vesijohtolaitos 1876-1936 /$$cJohn L. W. Lilja. 23 | 007336990 260 L $$aHelsinki :$$bHelsingin kaupungin vesijohtolaitos,$$c1938. 24 | 007336990 300 L $$a318, [1] s., 29 kuvalehteä, karttaliite :$$bkuvitettu, karttoja 25 | 007336990 336 L $$ateksti$$btxt$$2rdacontent 26 | 007336990 337 L $$akäytettävissä ilman laitetta$$bn$$2rdamedia 27 | 007336990 338 L $$anide$$bnc$$2rdacarrier 28 | 007336990 515 L $$a20304587. 29 | 007336990 583 L $$aMERGED FROM (FI-MELINDA)005336295 + (FI-MELINDA)000820219$$c2015-08-18T02:12:15+03:00$$5MELINDA 30 | 007336990 61014 L $$aHelsingin kaupunki.$$bVesijohtolaitos. 31 | 007336990 61014 L $$aHelsingin kaupungin vesilaitos. 32 | 007336990 650 7 L $$aympäristövaikutukset$$2ysa 33 | 007336990 650 7 L $$aympäristöhistoria$$2ysa 34 | 007336990 650 7 L $$aviemäröinti$$2ysa 35 | 007336990 650 7 L $$avesilaitokset$$2ysa 36 | 007336990 650 7 L $$avesilaitokset$$xhistoria$$zHelsinki$$2ysa 37 | 007336990 650 7 L $$avesihuoltolaitokset$$2ysa 38 | 007336990 650 7 L $$avesihuolto$$2ysa 39 | 007336990 650 7 L $$avesiensuojelu$$2ysa 40 | 007336990 650 7 L $$avedenkästtely$$2ysa 41 | 007336990 650 7 L $$avedenkäsittely$$2ysa 42 | 007336990 650 7 L $$avedenhankinta$$2ysa 43 | 007336990 650 7 L $$akunnallistekniikka$$2ysa 44 | 007336990 650 7 L $$akaupunkihistoria$$2ysa 45 | 007336990 650 7 L $$akaupungit$$2ysa 46 | 007336990 650 7 L $$akaupungistuminen$$2ysa 47 | 007336990 650 7 L $$ajätevedenpuhdistamot$$2ysa 48 | 007336990 650 7 L $$ahistoria$$2ysa 49 | 007336990 650 7 L $$avattenverk$$xhistoria$$zHelsingfors$$2allars 50 | 007336990 650 7 L $$avatten och avlopp$$xhistoria$$zHelsingfors$$2allars 51 | 007336990 650 7 L $$avesilaitokset$$2eks 52 | 007336990 650 7 L $$avesihuolto$$2eks 53 | 007336990 650 7 L $$ataloushistoria$$2eks 54 | 007336990 651 7 L $$aHelsinki$$2ysa 55 | -------------------------------------------------------------------------------- /test/merged/.gitignore: -------------------------------------------------------------------------------- 1 | *.nt 2 | *.hdt 3 | *.hdt.index* 4 | 5 | -------------------------------------------------------------------------------- /test/output/.gitignore: -------------------------------------------------------------------------------- 1 | *.nt 2 | *.hdt 3 | *.hdt.index* 4 | -------------------------------------------------------------------------------- /test/output/README.md: -------------------------------------------------------------------------------- 1 | Final output files of the conversion process will be placed here. 2 | -------------------------------------------------------------------------------- /test/refdata/.gitignore: -------------------------------------------------------------------------------- 1 | *.nt 2 | *.csv 3 | 4 | -------------------------------------------------------------------------------- /test/refdata/fennica-collection.ttl: -------------------------------------------------------------------------------- 1 | ../../refdata/fennica-collection.ttl -------------------------------------------------------------------------------- /test/refdata/fennica-dates.csv.gz: -------------------------------------------------------------------------------- 1 | ../../refdata/fennica-dates.csv.gz -------------------------------------------------------------------------------- /test/scripts: -------------------------------------------------------------------------------- 1 | ../scripts -------------------------------------------------------------------------------- /test/slices/.gitignore: -------------------------------------------------------------------------------- 1 | *.alephseq 2 | *.md5 3 | *.mrcx 4 | *.xml 5 | *.rdf 6 | *.nt 7 | *.ttl 8 | *.log 9 | -------------------------------------------------------------------------------- /test/sparql: -------------------------------------------------------------------------------- 1 | ../sparql -------------------------------------------------------------------------------- /test/split-input/.gitignore: -------------------------------------------------------------------------------- 1 | *.alephseq 2 | *.md5 3 | 4 | -------------------------------------------------------------------------------- /test/test_helper.bash: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | global_setup() { 4 | true # nothing at the moment 5 | } 6 | --------------------------------------------------------------------------------