你好,游客 登录
背景:
阅读新闻

asp.net对CNMARC数据进行解析 -

[日期:2013-03-25] 来源:  作者: [字体: ]

网上关于CNMARC数据处理的资料太少,而用ASP.net处理的则是少之又少,整整查了一天的资料和文档(其实有大半时间在查啊查),才把这个搞定。

最后得到的结论:只要把CNMARC的格式搞明白,那进行解析就简单多了,程序只需要进行字符串截取就欧克了

不过请仔细看代码中GetCharLength(string MarcText, int _Len)这个方法,下午的时候基本已经搞定,就是数据区截取值总是截取不对,调试半天才找到原因,因为中文字符是占用两个字符的,而在截取的时候,中文字符也是按照一个字符来算的,也就是需要算出来真正的截取开始位置和截取长度,,,,貌似有点绕。。。

代码贴出来,仅供参考~!

新建一个Default.aspx页面直接复制下面代码就欧克了

  1 //后台程序代码
  2 
  3 
  4 using System;
  5 using System.Collections;
  6 using System.Collections.Generic;
  7 using System.IO;
  8 using System.Linq;
  9 using System.Text;
 10 using System.Text.RegularExpressions;
 11 using System.Web;
 12 using System.Web.UI;
 13 using System.Web.UI.WebControls;
 14 
 15 public partial class _Default : System.Web.UI.Page
 16 {
 17     protected void Page_Load(object sender, EventArgs e)
 18     {
 19         if (IsPostBack) return;
 20         Session["page"] = "0";
 21         ShowByNum(int.Parse(Session["page"].ToString()));
 22     }
 23 
 24     //指定解析MARC数据并显示
 25     private void ShowByNum(int _Num)
 26     {
 27         ArrayList _ArrText = Loading();
 28         SortedList<string, string> _SName = GetName();
 29         SortedList<string, string> _SL = GetData(_ArrText[_Num].ToString());
 30 
 31         StringBuilder _SB = new StringBuilder();
 32         _SB.Append("<table>");
 33         for (int i = 0; i < _SL.Count; i++)
 34         {
 35             string _Key = _SL.ElementAt(i).Key;
 36 
 37             _SB.Append("<tr><td style=\"width:200px;text-align:right;\">");
 38             _SB.Append(_SName[_Key].ToString() + "</td><td>" + _SL[_Key].ToString() + "</td></tr>");
 39         }
 40         _SB.Append("</table>");
 41 
 42         d_Show.InnerHtml = _SB.ToString();
 43         lab_Page.Text = _Num.ToString() + " / " + _ArrText.Count.ToString();
 44     }
 45 
 46     //读入外部MARC数据包
 47     protected ArrayList Loading()
 48     {
 49         StreamReader objReader = new StreamReader(Server.MapPath("276663.iso"), System.Text.Encoding.Default);
 50         string sLine = "";
 51         ArrayList _ArrText = new ArrayList();
 52         while (sLine != null)
 53         {
 54             sLine = objReader.ReadLine();
 55             if (sLine != null)
 56                 _ArrText.Add(sLine);
 57         }
 58         objReader.Close();
 59 
 60         return _ArrText;
 61     }
 62 
 63     //解析指定MARC数据,返回SortedList<>
 64     private SortedList<string, string> GetData(string MarcText)
 65     {
 66         int MarcTextLength = Convert.ToInt32(MarcText.Substring(0, 5));//MARC记录文本总长度
 67         int _ConPos = Convert.ToInt32(MarcText.Substring(12, 5));//数据字段区起始地址
 68         int _Count = (_ConPos - 24) / 12;//字段个数
 69         string _Address = MarcText.Substring(24, _ConPos - 24 - 1);//地址目次区字符串    
 70         string _Contents = MarcText.Substring(_ConPos);//数据字段区字符串   
 71 
 72         //---------开始解析字段数据
 73 
 74         string[] _Keys = new string[_Count];//字段编号
 75         string[] _Values = new string[_Count];//字段值
 76 
 77         for (int i = 0; i < _Count; i++)
 78         {
 79             string _Num = _Address.Substring(i * 12, 3);//字段编号
 80             int _Len = int.Parse(_Address.Substring(i * 12 + 3, 4));//字段对应的数据区长度
 81             int _Pos = int.Parse(_Address.Substring(i * 12 + 7, 5));//字段对应的数据区开始位置
 82 
 83             _Keys[i] = _Address.Substring(i * 12, 3);//填充字段编号
 84 
 85             int _NewPos = GetCharLength(_Contents, _Pos + 2);//获取在中英文混排MARC文本中的实际位置
 86             int _NewLen = GetCharLength(_Contents, _Pos + 2 + _Len) - _NewPos;//获取实际截取长度
 87 
 88             _Values[i] = _Contents.Substring(_NewPos, _NewLen);//填充字段值
 89 
 90             //Response.Write(_Num + "  " + _Len + "  " + _Pos + "   " + _Values[i].ToString() + "<br />");
 91         }
 92 
 93         SortedList<string, string> _SL = new SortedList<string, string>();
 94         for (int i = 0; i < _Count; i++)
 95         {
 96             if (_SL.ContainsKey(_Keys[i]))
 97             {
 98                 _SL[_Keys[i]] += " 【!】 " + _Values[i];
 99             }
100             else
101             {
102                 _SL.Add(_Keys[i], _Values[i]);
103             }
104         }
105 
106         return _SL;
107     }
108 
109     //字段编号对应的字段名称
110     private SortedList<string, string> GetName()
111     {
112         SortedList<string, string> _SL = new SortedList<string, string>();
113         _SL.Add("001", "控制号");
114         _SL.Add("005", "最近一次作业的日期和时间");
115         _SL.Add("010", "国际标准书号");
116         _SL.Add("011", "国际标准连续出版物号");
117         _SL.Add("016", "国际标准音像编码");
118         _SL.Add("091", "统一书刊号");
119         _SL.Add("094", "标准号");
120 
121         _SL.Add("100", "一般处理数据");
122         _SL.Add("101", "文献语种");
123         _SL.Add("102", "出版/制作国别");
124         _SL.Add("105", "专著性文字资料");
125         _SL.Add("106", "文字资料 — 形态特征");
126         _SL.Add("110", "连续出版物");
127 
128         _SL.Add("200", "题名与责任说明");
129         _SL.Add("205", "版本说明");
130         _SL.Add("207", "资料特殊细节项:连续出版物编号");
131         _SL.Add("210", "出版发行等");
132         _SL.Add("215", "载体形态项");
133         _SL.Add("225", "丛编项");
134 
135         _SL.Add("300", "一般性附注");
136         _SL.Add("303", "著录信息一般性附注");
137         _SL.Add("304", "题名与责任说明附注");
138         _SL.Add("305", "版本与书目沿革附注");
139         _SL.Add("306", "出版发行附注");
140         _SL.Add("307", "载体形态附注");
141         _SL.Add("308", "丛编附注");
142         _SL.Add("310", "装订与获得方式附注");
143         _SL.Add("311", "连接字段附注");
144         _SL.Add("312", "相关题名附注");
145         _SL.Add("314", "知识责任附注");
146         _SL.Add("320", "内部书目/索引附注");
147         _SL.Add("324", "原作版本附注");
148         _SL.Add("325", "复制品附注");
149         _SL.Add("327", "内容附注");
150         _SL.Add("328", "学位论文附注");
151         _SL.Add("330", "提要或文摘附注");
152         _SL.Add("333", " 用户/使用对象附注");
153 
154         _SL.Add("410", "丛编");
155         _SL.Add("421", "补编");
156         _SL.Add("422", "正编");
157         _SL.Add("423", "合订");
158         _SL.Add("430", "继承");
159         _SL.Add("440", "由…继承");
160         _SL.Add("451", "同一载体的其他版本");
161         _SL.Add("452", " 不同载体的其他版本");
162         _SL.Add("461", "总集");
163         _SL.Add("462", "分集");
164         _SL.Add("488", "其他相关作品");
165 
166         _SL.Add("500", "统一题名");
167         _SL.Add("510", "并列正题名");
168         _SL.Add("512", "封面题名");
169         _SL.Add("513", "附加题名页题名");
170         _SL.Add("514", "卷端题名");
171         _SL.Add("515", "逐页题名");
172         _SL.Add("516", "书脊题名");
173         _SL.Add("517", "其它题名");
174         _SL.Add("518", " 现行标准拼写形式的题名");
175         _SL.Add("532", "展开题名");
176         _SL.Add("540", " 编目员补充的附加题名");
177 
178         _SL.Add("600", "个人名称主题");
179         _SL.Add("601", "团体名称主题");
180         _SL.Add("602", "家族名称主题");
181         _SL.Add("604", "名称与题名主题");
182         _SL.Add("605", "题名主题");
183         _SL.Add("606", "论题主题");
184         _SL.Add("607", "地理名称主题");
185         _SL.Add("610", "非控主题词");
186         _SL.Add("690", " 中国图书馆分类法分类号");
187         _SL.Add("692", " 中国科学院图书馆图书分类法分类号");
188         _SL.Add("694", " 中国人民大学图书馆图书分类法分类号");
189         _SL.Add("696", "国内其它分类号");
190 
191         _SL.Add("701", "个人名称 — 等同知识责任");
192         _SL.Add("702", "个人名称 — 次要知识责任");
193         _SL.Add("711", "团体名称 — 等同知识责任");
194         _SL.Add("712", "团体名称 — 次要知识责任");
195         _SL.Add("721", "家族名称 — 等同知识责任");
196         _SL.Add("722", "家族名称 — 次要知识责任");
197         _SL.Add("730", "名称—非规范名称");
198 
199         _SL.Add("801", "记录来源");
200         _SL.Add("802", "ISSN中心");
201         _SL.Add("856", "电子资源定位与检索");
202 
203         _SL.Add("920", "馆藏信息");
204         _SL.Add("998", " 书目记录所属成员馆代码");
205 
206         return _SL;
207     }
208 
209     //获得字符的长度
210     private int GetCharLength(string MarcText, int _Len)
211     {
212         byte[] sarr = System.Text.Encoding.Default.GetBytes(MarcText);
213         int i = 0, j = 0;
214         while (i < _Len && j < MarcText.Length - 1)
215         {
216             sarr = System.Text.Encoding.Default.GetBytes(MarcText.Substring(j, 1));
217             if (sarr.Length == 2)
218             {
219                 i += 2;
220             }
221             else
222             {
223                 i += 1;
224             }
225             j += 1;
226         }
227         return j;
228     }
229 
230     protected void btn_PUp_Click(object sender, EventArgs e)
231     {
232         Session["page"] = (int.Parse(Session["page"].ToString()) - 1).ToString();
233         ShowByNum(int.Parse(Session["page"].ToString()));
234     }
235     protected void btn_PDown_Click(object sender, EventArgs e)
236     {
237         Session["page"] = (int.Parse(Session["page"].ToString()) + 1).ToString();
238         ShowByNum(int.Parse(Session["page"].ToString()));
239     }
240 }
 1 <!-- 前台代码 -->
 2 
 3 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
 4 
 5 <!DOCTYPE html>
 6 
 7 <html xmlns="http://www.w3.org/1999/xhtml">
 8 <head runat="server">
 9     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
10     <title></title>
11     <style>
12         table {
13             background:#000000;
14         }
15         tr {
16             background: #ffffff;
17         }
18         td {
19             padding:5px;
20         }
21 
22     </style>
23 </head>
24 <body>
25     <form id="form1" runat="server">
26         <div>
27             <asp:Button runat="server" ID="btn_PUp" Text="上一条数据" OnClick="btn_PUp_Click" />
28             <asp:Label runat="server" ID="lab_Page"></asp:Label>
29             <asp:Button runat="server" ID="btn_PDown" Text="下一条数据" OnClick="btn_PDown_Click" />
30         </div>
31 
32         <div runat="server" id="d_Show">
33 
34 
35         </div>
36     </form>
37 </body>
38 </html>

如需转载,请注明出处:小胤 * - 博客园






收藏 推荐 打印 | 录入:admin | 阅读:
相关新闻