¡Todo castor!¡Hoy es viernes, y eso significa tiempo para hacer un balance!Continuando con los temas de nuestro club de bibliotecas, me apresuro a hacer que todos los involucrados estén un poco felices: ¡lo hice!Después de un mar de células nerviosas gastadas, después de una gran cantidad de documentación sobre formatos MARC y un montón de muletas, todavía armé un convertidor relativamente sano (pero aún con un código terrible :)) (+ controlador + todo lo que es suficiente para la fantasía) para formatos MARC.https://github.com/HerzenLibRu/BatchMarc (controlador, las reglas están escritas en js)https://github.com/t0pep0/marc21 (biblioteca en Go para trabajar con formatos marc)Puede ejecutarlo así:vaya a ejecutar main.go inputFile.ldb outputFile.ldb rules.js Lasreglas se aplican a cada entrada marc en el archivo.La documentación aún no se ha escrito, pero ¿está todo por delante? =)Algunos de los matices de la biblioteca (y, en consecuencia, del convertidor):- los subcampos se almacenan en una lista vinculada con la clasificación cuando se agregan (las solicitudes específicas de colegas no permitieron el uso de hashmap)
- Nombrar banderas de líder que quizás no te gusten
Características de las reglas de escritura:cuando su regla comienza a ejecutarse, ya hay dos objetos: orig y res - orig - el registro original, res - lo que eventualmente se escribirá en el archivo de salida, y cuando comienza su regla, res es un objeto vacío, recién inicializado, en mientras que orig está lleno de datos  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();
Cuando sus reglas funcionen, Go tomará los datos de res y los escribirá en un archivo.Atencion El código no está optimizado, considérelo como el producto viable más pequeño.Un ejemplo de las reglas se puede encontrar en el repositorio de BatchMarc.PullRequest, IssueRequest: aceptado porUPD: js para escribir reglas se selecciona como el idioma más ampliamente distribuido (en el entorno de la biblioteca, incluido)