.netcore解析marc

这个是主要的方法

/// <summary>
  /// 解析marc
  /// </summary>
  /// <param name="marcText"></param>
  /// <returns></returns>
  public static List<Marc> GetListByText(string marcText)
  {
      //处理分隔符,不同渠道获取的数据可能分隔符不一样,统一进行处理
      marcText = marcText.Replace("_x001e_", ((char)30).ToString());//字段分隔符
      marcText = marcText.Replace("_x001f_", ((char)31).ToString());//子字段标识
      marcText = marcText.Replace("_x001d_", ((char)29).ToString());//结束符
      int conPos = Convert.ToInt32(marcText.Substring(12, 5));//数据字段区起始地址
      int count = (conPos - 24) / 12;//字段个数
      string address = marcText.Substring(24, conPos - 24 - 1);//地址目次区字符串    
      string contents = marcText.Substring(conPos);//数据字段区字符串   

      //---------开始解析字段数据

      List<Marc> list = new List<Marc>();
      for (int i = 0; i < count; i++)
      {
          var marcEntity = new Marc();
          int len = int.Parse(address.Substring(i * 12 + 3, 4));//字段对应的数据区长度
          int pos = int.Parse(address.Substring(i * 12 + 7, 5));//字段对应的数据区开始位置

          marcEntity.Code = address.Substring(i * 12, 3);//编号

          int newPos = GetCharLength(contents, pos);
          int newLen = GetCharLength(contents, pos + len) - newPos;
          if (newLen <= 0)
          {
              continue;
          }
          var tmpString = contents.Substring(newPos, newLen - 1);
          if (tmpString.IndexOf(((char)31).ToString()) == 0)
          {
              marcEntity.Z = "  ";
              marcEntity.Content = contents.Substring(newPos, newLen - 1);
          }
          else if (tmpString.IndexOf(((char)31).ToString()) == 1)
          {
              marcEntity.Z = contents.Substring(newPos, 1) + "";
              marcEntity.Content = contents.Substring(newPos + 1, newLen - 2);
          }
          else if (tmpString.IndexOf(((char)31).ToString()) != -1)
          {
              marcEntity.Z = contents.Substring(newPos, 2);
              marcEntity.Content = contents.Substring(newPos + 2, newLen - 3);
          }
          else
          {
              marcEntity.Z = "";
              marcEntity.Content = contents.Substring(newPos, newLen - 1);
          }
          //查编号对应的名称,NameList是个SortedList<string, string>
          var name = "";
          NameList.TryGetValue(marcEntity.Code, out name);
          marcEntity.Name = name;
          list.Add(marcEntity);
      }
      list.Insert(0, new Marc()
      {
          Code = "000",
          Content = marcText.Substring(0, 24)
      });
      return list;
  }

中文和特殊字符会导致位置错位,这个方法是重点

  /// <summary>
  /// 计算中文和特殊字符长度获得真实的字符长度
  /// </summary>
  /// <param name="marcText"></param>
  /// <param name="_Len"></param>
  /// <returns></returns>
  private static int GetCharLength(string marcText, int _Len)
  {
      byte[] arr = System.Text.Encoding.UTF8.GetBytes(marcText);
      int i = 0, j = 0;
      while (i < _Len && j < marcText.Length - 1)
      {
          arr = System.Text.Encoding.UTF8.GetBytes(marcText.Substring(j, 1));
          i += arr.Length;
          j += 1;
      }
      return j;
  }

编号和名称

        public static SortedList<string, string> NameList;
        static MarcParseUtil()
        {
            NameList = new SortedList<string, string>();
            NameList.Add("001", "控制号");
            NameList.Add("005", "最近一次作业的日期和时间");
            NameList.Add("010", "国际标准书号");
            NameList.Add("011", "国际标准连续出版物号");
            NameList.Add("016", "国际标准音像编码");
            NameList.Add("091", "统一书刊号");
            NameList.Add("094", "标准号");
            NameList.Add("100", "一般处理数据");
            NameList.Add("101", "文献语种");
            NameList.Add("102", "出版/制作国别");
            NameList.Add("105", "专著性文字资料");
            NameList.Add("106", "文字资料 — 形态特征");
            NameList.Add("110", "连续出版物");
            NameList.Add("200", "题名与责任说明");
            NameList.Add("205", "版本说明");
            NameList.Add("207", "资料特殊细节项:连续出版物编号");
            NameList.Add("210", "出版发行等");
            NameList.Add("215", "载体形态项");
            NameList.Add("225", "丛编项");
            NameList.Add("300", "一般性附注");
            NameList.Add("303", "著录信息一般性附注");
            NameList.Add("304", "题名与责任说明附注");
            NameList.Add("305", "版本与书目沿革附注");
            NameList.Add("306", "出版发行附注");
            NameList.Add("307", "载体形态附注");
            NameList.Add("308", "丛编附注");
            NameList.Add("310", "装订与获得方式附注");
            NameList.Add("311", "连接字段附注");
            NameList.Add("312", "相关题名附注");
            NameList.Add("314", "知识责任附注");
            NameList.Add("320", "内部书目/索引附注");
            NameList.Add("324", "原作版本附注");
            NameList.Add("325", "复制品附注");
            NameList.Add("327", "内容附注");
            NameList.Add("328", "学位论文附注");
            NameList.Add("330", "提要或文摘附注");
            NameList.Add("333", " 用户/使用对象附注");
            NameList.Add("410", "丛编");
            NameList.Add("421", "补编");
            NameList.Add("422", "正编");
            NameList.Add("423", "合订");
            NameList.Add("430", "继承");
            NameList.Add("440", "由…继承");
            NameList.Add("451", "同一载体的其他版本");
            NameList.Add("452", " 不同载体的其他版本");
            NameList.Add("461", "总集");
            NameList.Add("462", "分集");
            NameList.Add("488", "其他相关作品");
            NameList.Add("500", "统一题名");
            NameList.Add("510", "并列正题名");
            NameList.Add("512", "封面题名");
            NameList.Add("513", "附加题名页题名");
            NameList.Add("514", "卷端题名");
            NameList.Add("515", "逐页题名");
            NameList.Add("516", "书脊题名");
            NameList.Add("517", "其它题名");
            NameList.Add("518", " 现行标准拼写形式的题名");
            NameList.Add("532", "展开题名");
            NameList.Add("540", " 编目员补充的附加题名");
            NameList.Add("600", "个人名称主题");
            NameList.Add("601", "团体名称主题");
            NameList.Add("602", "家族名称主题");
            NameList.Add("604", "名称与题名主题");
            NameList.Add("605", "题名主题");
            NameList.Add("606", "论题主题");
            NameList.Add("607", "地理名称主题");
            NameList.Add("610", "非控主题词");
            NameList.Add("690", " 中国图书馆分类法分类号");
            NameList.Add("692", " 中国科学院图书馆图书分类法分类号");
            NameList.Add("694", " 中国人民大学图书馆图书分类法分类号");
            NameList.Add("696", "国内其它分类号");
            NameList.Add("701", "个人名称 — 等同知识责任");
            NameList.Add("702", "个人名称 — 次要知识责任");
            NameList.Add("711", "团体名称 — 等同知识责任");
            NameList.Add("712", "团体名称 — 次要知识责任");
            NameList.Add("721", "家族名称 — 等同知识责任");
            NameList.Add("722", "家族名称 — 次要知识责任");
            NameList.Add("730", "名称—非规范名称");
            NameList.Add("801", "记录来源");
            NameList.Add("802", "ISSN中心");
            NameList.Add("856", "电子资源定位与检索");
            NameList.Add("920", "馆藏信息");
            NameList.Add("998", " 书目记录所属成员馆代码");
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值