C#实现图书馆程序导入ISO-2709格式(MARC)功能
1.导入
/// <summary>
/// 导入ISO2709
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void 导入ISO2709ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "ISO2709文件|*.ISO";
ofd.Multiselect = false;
ofd.Title = "请选择要导入的ISO2709文件.";
if (ofd.ShowDialog() != DialogResult.OK)
{
return;
}
if (MessageBox.Show("要将“" + ofd.FileName + "”装入“" + toolStripcmb_SMK.Text + "”的待选书库吗?", "上装确认", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes)
{
return;
}
StreamReader objReader = new StreamReader(ofd.FileName, System.Text.Encoding.Default);
string sLine = "";
ArrayList _ArrText = new ArrayList();
while (sLine != null)
{
sLine = objReader.ReadLine();
if (sLine != null)
_ArrText.Add(sLine);
}
objReader.Close();
DBUtility.SQuery sq;
foreach (string marc in _ArrText)
{
SortedList<string, string> Li = GetData(marc);
//要插入的marc
string insert_marc = marc.Substring(5, 4) + (char)30;//头标区
for (int i = 0; i < Li.Count; i++)
{
//拼接要插入的marc字段
insert_marc += Li.Keys[i] + Li.Values[i] + (char)30;//不能去掉(char)31,去掉(char)30添加(char)30(标识3+指2+字段内容)
}
sq = DBUtility.SQuery.Create(
@"INSERT INTO 待采书库 (馆键码,标准编码,题名,责任者,版次,出版者,出版年,单价,MARC,操作员,入库日期,库键码,征订号) VALUES
(@馆键码,@标准编码,@题名,@责任者,@版次,@出版者,@出版年,@单价,@MARC,@操作员,getdate(),@库键码,@征订号)");
//解析marc
sq.Params.Add("@馆键码", SystemState.GJM);
sq.Params.Add("@标准编码", Li.Keys.Contains("010") ? GetMarcValue(Li["010"], "标准编码") : "");
sq.Params.Add("@题名", Li.Keys.Contains("200") ? GetMarcValue(Li["200"], "题名") : "");
sq.Params.Add("@责任者", Li.Keys.Contains("200") ? GetMarcValue(Li["200"], "责任者") : "");
sq.Params.Add("@版次", Li.Keys.Contains("205") ? GetMarcValue(Li["205"], "版次") : "");
sq.Params.Add("@出版者", Li.Keys.Contains("210") ? GetMarcValue(Li["210"], "出版者") : "");
sq.Params.Add("@出版年", Li.Keys.Contains("210") ? GetMarcValue(Li["210"], "出版年") : "");
sq.Params.Add("@单价", Li.Keys.Contains("010") ? GetMarcValue(Li["010"], "单价") : "");
sq.Params.Add("@marc", insert_marc);
sq.Params.Add("@操作员", Common.SystemState.UserID);
sq.Params.Add("@库键码", toolStripcmb_SMK.ComboBox.SelectedValue);
sq.Params.Add("@征订号", Li.Keys.Contains("092") ? GetMarcValue(Li["092"], "征订号") : "");
sq.ExecuteNonQuery();
//success += sq.ExecuteNonQuery() > 0 ? 1 : 0;
}
MessageBox.Show("数据上装完毕", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
//刷新
toolStripbtn_query_Click(sender, e);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
//解析指定MARC数据,返回SortedList<>
private SortedList<string, string> GetData(string MarcText)
{
int MarcTextLength = Convert.ToInt32(MarcText.Substring(0, 5));//MARC记录文本总长度,00931
int _ConPos = Convert.ToInt32(MarcText.Substring(12, 5));//数据字段区起始地址,00253
int _Count = (_ConPos - 24) / 12;//字段个数,19
string _Address = MarcText.Substring(24, _ConPos - 24 - 1);//地址目次区字符串
string _Contents = MarcText.Substring(_ConPos);//数据字段区字符串
//---------开始解析字段数据
string[] _Keys = new string[_Count];//字段编号
string[] _Values = new string[_Count];//字段值
string[] Values = _Contents.Split((char)30);//用(char)30分割数据字段区字符串,用于给后面的_Keys对应字段内容
for (int i = 0; i < _Count; i++)
{
string _Num = _Address.Substring(i * 12, 3);//字段编号
int _Len = int.Parse(_Address.Substring(i * 12 + 3, 4));//字段对应的数据区长度
int _Pos = int.Parse(_Address.Substring(i * 12 + 7, 5));//字段对应的数据区开始位置
_Keys[i] = _Address.Substring(i * 12, 3);//填充字段编号
_Values[i] = Values[i];//填充字段值
}
SortedList<string, string> _SL = new SortedList<string, string>();
for (int i = 0; i < _Count; i++)
{
if (_SL.ContainsKey(_Keys[i]))
{
_SL[_Keys[i]] += (char)31 + _Values[i];//如果存在2个701则用(char)31分开
}
else
{
_SL.Add(_Keys[i], _Values[i]);
}
}
return _SL;
}
/// <summary>
/// 获取正题名
/// </summary>
private string GetMarcValue(string str, string item)
{
string[] subArray = str.Substring(str.IndexOf((char)31)).Trim().Split(new char[] { (char)31 }, StringSplitOptions.RemoveEmptyEntries);
foreach (string subStr in subArray)
{
switch (item)
{
case "题名":
case "语种":
case "出版地":
case "标准编码":
if (subStr.Substring(0, 1) == "a")
{
return subStr.Substring(1);
}
break;
case "题名缩写":
if (subStr.Substring(0, 1) == "9")
{
return subStr.Substring(1);
}
break;
case "责任者":
if (subStr.Substring(0, 1) == "f")
{
return subStr.Substring(1);
}
break;
case "出版者":
if (subStr.Substring(0, 1) == "c")
{
return subStr.Substring(1);
}
break;
case "版次":
if (subStr.Substring(0, 1) == "a")
{
return subStr.Substring(1);
}
break;
case "单价":
if (subStr.Substring(0, 1) == "d")
{
return subStr.Substring(1);
}
break;
case "出版年":
if (subStr.Substring(0, 1) == "d")
{
return subStr.Substring(1);
}
break;
case "索书号":
if (subStr.Substring(0, 1) == "d")
{
string val = "";
val = subStr.Substring(1);
foreach (string subStr2 in subArray)
{
if (subStr.Substring(0, 1) == "e")
{
val += "/" + subStr2.Substring(1);
break;
}
}
return val;
}
break;
case "征订号":
if (subStr.Substring(0, 1) == "b")
{
return subStr.Substring(1);
}
break;
}
}
return "";
}
C#实现图书馆程序导入ISO-2709格式(MARC)功能的更多相关文章
- ISO日期格式标准,浏览器到服务器到mysql中的时区
时区简单理解 https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA 上面的链接是时区的wiki说明,下面说说我记住的部分: GMT时区是格林威治标准时间,我 ...
- 如何将Android默认的Camra程序导入到eclipse中
由于工作需要将camera源码导入到Eclipse中,找了很多的方法,现将自己的整理发出来.... 由于开发的要求,需要将Android默认的Camra程序导入到eclipse中,进行修改和再开发. ...
- tool - 支持TestLink 1.93,将excel格式用例转化成可以导入的xml格式
tool - 支持TestLink 1.93,将excel格式用例转化成可以导入的xml格式 https://github.com/zhangzheyuk/CaseConvert
- 使用PHPExcel导入导出excel格式文件
使用PHPExcel导入导出excel格式文件 作者:zccst 因为导出使用较多,以下是导出实现过程. 第一步,将PHPExcel的源码拷贝到项目的lib下 文件包含:PHPExcel.ph ...
- 使 IIS 6.0 可以在 64 位 Windows 上运行 32 位应用程序 试图加载格式不正确的程序。
原文 使 IIS 6.0 可以在 64 位 Windows 上运行 32 位应用程序 试图加载格式不正确的程序. win7 64位操作系统上边运行IIS网站应用的时候,提示错误"试图加载格式 ...
- 将Ext JS 5应用程序导入Web项目以及实现本地化
在Ext JS 5,使用了新的脚本和样式加载方式,这对于将应用程序导入到Web项目中产生了点小麻烦.而对于本地化文件的导入,也采用了新的方式,本文将一一解答这些问题. 将Ext JS 5应用程序导入W ...
- poi导入读取时间格式问题
万能处理方案: 所有日期格式都可以通过getDataFormat()值来判断 yyyy-MM-dd-----14 yyyy年m月d日--- 31 yyyy年m月-------57 m月d日 ---- ...
- 使用tcpcopy导入线上流量进行功能和压力测试
- 假设我们要上线一个两年内不会宕机的先进架构.在上线前,免不了单元测试,功能测试,还有使用ab,webbench等等进行压力测试. 但这些步骤非生产环境下正式用户的行为.或许你会想到灰度上线,但毕竟 ...
- Python程序入口 __name__ == ‘__main__‘ 有重要功能(多线程)而非编程习惯
文章来源于互联网(https://jq.qq.com/?_wv=1027&k=rX9CWKg4) 在Python中,被称为「程序的入口」的 if name =='main': 总是出现在各种示 ...
随机推荐
- win10,软件, 发布者不受信任怎么办
这个方法比较管用:右键单击windows左下角,弹出右击菜单选择‘命令提示符(管理员)(A)’,然后用DOS命令安装程序.就可以了 PS:win10的cmd可以直接复制粘贴了.
- DEDE5.7如何制作网站地图?
DEDE用的人很多,可能大家在使用的过程中会碰到一些问 题,这很正常的,今天我们来讲讲DEDE5.7如何制作网站地图,其实网站地图分两种,一种做给网友看的,方便网友可以方便地找到自己想浏览的内容,另外 ...
- iOS 中关闭键盘方法
在 iOS 程序中当想要在文本框中输入数据,轻触文本框会打开键盘.对于 iPad 程序,其键盘有一个按钮可以用来关闭键盘,但是 iPhone 程序中的键盘却没有这样的按钮,不过我们可以采取一些方法关闭 ...
- No data in the view dba_hist_undostat (文档 ID 1558157.1)
APPLIES TO: Oracle Database - Enterprise Edition - Version 10.2.0.1 to 11.2.0.3 [Release 10.2 to 11. ...
- 翻译:为 URL Rewrite 模块创建重写规则
原文名称:Creating Rewrite Rules for the URL Rewrite Module 原文地址:http://www.iis.net/learn/extensions/url- ...
- Cv运动分析与对象跟踪(转)
Cv运动分析与对象跟踪 目录 [隐藏] 1 背景统计量的累积 1.1 Acc 1.2 SquareAcc 1.3 MultiplyAcc 1.4 RunningAvg 2 运动模板 2.1 Upd ...
- jmeter随笔(1)-在csv中数据为json格式的数据不完整
昨天同事在使用jmeter遇到问题,在csv中数据为json格式的数据,在jmeter中无法完整的取值,小怪我看了下,给出解决办法,其实很简单,我们一起看看,看完了记得分享给你的朋友. 问题现象: 1 ...
- 一张图看Goodle Clean设计架构
之前用一张图分析了Google给出的MVP架构,但是在Google给出的所有案例里面除了基本的MVP架构还有其它几种架构,今天就来分析其中的Clean架构.同样的,网上介绍Clean架构的文章很多,我 ...
- Epic - Desirable Number
A number is called 'desirable' if all thedigits are strictly ascending eg: 159 as 1<5<9. You k ...
- [转]Markdown 语法手册
Markdown 是一种轻量级标记语言,能将文本换成有效的XHTML(或者HTML)文档,它的目标是实现易读易写,成为一种适用于网络的书写语言. Markdown 语法简洁明了,易于掌握,所以用它来写 ...