BatchMarc обрабатывем marc файлы на go + js
Всем бобра!
Сегодня пятница, а это значит время подводить итоги!
Продолжая темы нашего библиотечного клуба спешу немного порадовать всех причастных: я сделяль!
Спустя море потраченных нервных клеток, спустя ад документации по marc форматам, и кучу костылей я всё таки собрал относительно вменяемый (но пока с ужасным кодом :)) конвертор (+обработчик +всё, на что хватит фантазии) для marc форматов.
https://github.com/HerzenLibRu/BatchMarc (обработчик, правила пишутся на js)
https://github.com/t0pep0/marc21 (библиотека на Go для работы с marc форматами)
Запускать можно вот так:
go run main.go inputFile.ldb outputFile.ldb rules.js
Правила применяются к каждой marc записи в файле.
Документация пока ещё не писалась, но у нас же все впереди? =)
Некоторые ньюансы библиотеки (а соответсвенно и конвертора):
- подполя хранятся связным списком с сортировкой при добавлении (специфичные запросы от коллег не позволили использовать hashmap)
- именование флагов лидера может Вам не понравится
Особености написания правил:
Когда Ваше правило начинает выполняться уже существует два объекта: orig и res — orig — оригинальная запись, res — то, что в итоге будет записанно в выходной файл и при старте Вашего правила res — пустой объект, только что инициализированный, в то время как orig заполнен данными
function VariableSubField(name, data){
this.Name = name;
this.Data = data;
}
function VariableField(tag, indicatorOne, indicatorTwo) {
this.Tag = tag;
this.IndicatorOne = indicatorOne;
this.IndicatorTwo = indicatorTwo;
this.RawData = [];
this.SubField = [];
}
function Leader() {
this.Status = "";
this.Type = "";
this.BibLevel = "";
this.ControlType = "";
this.CharacterEncoding = "";
this.IndicatorCount = "";
this.SubfieldCodeCount = "";
this.EncodingLevel = "";
this.CatalogingForm = "";
this.MultipartLevel = "";
this.LengthOFFieldPort = "";
this.StartCharPos = "";
this.LengthImplemenDefine = "";
this.Undefine = "";
}
function MarcRecord(){
this.Leader = new Leader()
this.VariableField = []
};
orig = new MarcRecord();
res = new MarcRecord();
Когда Ваши правила отработают, Go заберет данные из res, и запишет их в файл.
Внимание! Код не оптимизирован, считайте что это минимальный жизнеспособный продукт.
Пример правил можете найти в репозитарии BatchMarc.
PullRequest, IssueRequest — принимаются
UPD: js для написания правил выбран как наиболее широко распростарненный (в библиотечной среде, в том числе) язык