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': 总是出现在各种示 ...
随机推荐
- 最大公约数Greatest Common Divisor(GCD)
一 暴力枚举法 原理:试图寻找一个合适的整数i,看看这个整数能否被两个整形参数numberA和numberB同时整除.这个整数i从2开始循环累加,一直累加到numberA和numberB中较小参数的一 ...
- java socket通讯(一) 入门示例
一.入门 要想学习socket通讯,首先得知道tcp/ip和udp连接,具体可参考浅谈TCP/IP 和 UDP的区别 二.示例 首先新建了一个java工程,包括两个部分,客户端SocketClient ...
- 如何获取SQL Server 2008数据库数据文件的位置
在SQL Server中,要获取数据库数据文件的物理位置,有三种方法: sp_helpdb bright name filename f ...
- 项目管理: Maven 让事情变得简单
http://maven.apache.org/, Maven其实就是为java实现的一个构建工具.他比Ant更高端. 目前,绝大多数开发人员都把 Ant 当作 Java 编程项目的标准构建工具.遗 ...
- 使用appium模拟用户发送短信
一段简单粗糙的代码.主要是实现的功能是模拟用户发送短信的功能. python版本3.5.2 appium版本1.4.16.1 from appium import webdriver desired_ ...
- 超图(hypergraph)
超图是什么? 超图的本质特征在于它的超边,它可以连接两个以上的结点(包括两个).按这样的意义来说,我们所熟悉的普通图只是超图的一个特例而已,而超图则定义了一个更加宽泛的图. 超图的数学定义为:对于超图 ...
- 业务gis 搭建一个skyline 的js模板 (一)
刚刚我们说的是二维的系统,如果要展示三维,我们是不是也需要这样,答案是必须的,是一定要,如果你是基于skyline做三维开发,业务开发人员要去搞那套api估计要吐血,所以我们必须得封装起来,这里不介绍 ...
- 【测试】通过SYS用户,对SCOTT用户的会话进行跟踪,并分析此会话中性能消耗较高的SQL,分析并给出优化建议。
①连接到scott下,查询scott对应的sid,serial# SQL> select sid,serial#,username from v$session where username=' ...
- APP发布Xcode7
一.准备工作 1>准备3.5寸.4寸.4.7寸.5.5寸的程序截图至少个1张,如果支持iPad,那么iPad截图也要有.这些截图尽量截取页面漂亮的,因为这些截图是要放在AppStore中展示的. ...
- 跟我学 NHibernate (二)
1. 在 NHibernate 中使用事务, 主要代码如下: #region 事务 public IList<Customer> GetAll() { // 开启事物 using (ITr ...