网上关于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>
如需转载,请注明出处:小胤 * - 博客园
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>