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)功能的更多相关文章

  1. ISO日期格式标准,浏览器到服务器到mysql中的时区

    时区简单理解 https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA 上面的链接是时区的wiki说明,下面说说我记住的部分: GMT时区是格林威治标准时间,我 ...

  2. 如何将Android默认的Camra程序导入到eclipse中

    由于工作需要将camera源码导入到Eclipse中,找了很多的方法,现将自己的整理发出来.... 由于开发的要求,需要将Android默认的Camra程序导入到eclipse中,进行修改和再开发. ...

  3. tool - 支持TestLink 1.93,将excel格式用例转化成可以导入的xml格式

     tool - 支持TestLink 1.93,将excel格式用例转化成可以导入的xml格式  https://github.com/zhangzheyuk/CaseConvert

  4. 使用PHPExcel导入导出excel格式文件

    使用PHPExcel导入导出excel格式文件  作者:zccst  因为导出使用较多,以下是导出实现过程.  第一步,将PHPExcel的源码拷贝到项目的lib下  文件包含:PHPExcel.ph ...

  5. 使 IIS 6.0 可以在 64 位 Windows 上运行 32 位应用程序 试图加载格式不正确的程序。

    原文 使 IIS 6.0 可以在 64 位 Windows 上运行 32 位应用程序 试图加载格式不正确的程序. win7 64位操作系统上边运行IIS网站应用的时候,提示错误"试图加载格式 ...

  6. 将Ext JS 5应用程序导入Web项目以及实现本地化

    在Ext JS 5,使用了新的脚本和样式加载方式,这对于将应用程序导入到Web项目中产生了点小麻烦.而对于本地化文件的导入,也采用了新的方式,本文将一一解答这些问题. 将Ext JS 5应用程序导入W ...

  7. poi导入读取时间格式问题

    万能处理方案: 所有日期格式都可以通过getDataFormat()值来判断 yyyy-MM-dd-----14 yyyy年m月d日--- 31 yyyy年m月-------57 m月d日  ---- ...

  8. 使用tcpcopy导入线上流量进行功能和压力测试

    - 假设我们要上线一个两年内不会宕机的先进架构.在上线前,免不了单元测试,功能测试,还有使用ab,webbench等等进行压力测试. 但这些步骤非生产环境下正式用户的行为.或许你会想到灰度上线,但毕竟 ...

  9. Python程序入口 __name__ == ‘__main__‘ 有重要功能(多线程)而非编程习惯

    文章来源于互联网(https://jq.qq.com/?_wv=1027&k=rX9CWKg4) 在Python中,被称为「程序的入口」的 if name =='main': 总是出现在各种示 ...

随机推荐

  1. 织梦后台更新,报错DedeCMS Error:Tag disabled:"php" more...

    网站采用织梦v5.7版本,在做过一次后台补丁更新后,再对网站“生成”操作的时候,无厘头出现报错“ 网站后台--系统--系统基本参数---其他选项 ---模板引擎禁用标签:php  ,把php删掉 保存 ...

  2. ios下,对于position:fixed支持不完美的额解决方案

    ios下,当有文本框时,会调用输入法,而这个时候,定位(fixed)在底部的东西,就会被弹上例,离底部有段距离,这算是个坑了. 我的解决方案是这样的. 除了定位在底部的元素外,用一个大div把其他元素 ...

  3. C#局域网聊天工具_UDP广播

    接上一讲,程序启动就要发送广播消息,如何发送广播消息,这一讲将给大家好好讲讲网络广播的知识,以及C#如何实现广播. 第一部分.什么是广播地址,以及广播地址怎么计算 1.1 广播地址是什么? 主机号全为 ...

  4. ASP.NET MVC开发微信(一)

    public string index() { return Content(""); }

  5. 翻译:Knockout 快速上手 - 4: 你需要知道的顶级特性

    Knockout 最棒的一个特点就是它的可扩展性.Knockout 存在大量的扩展点,包含大量的工具来创建我们的应用程序.许多开发者除了 Knockout 核心库之外没有使用任何其他的脚本库 ( 甚至 ...

  6. 007 The Inheritance In JAVA

    在JAVA中有一个特型叫继承(Inheritance),通过继承我们可以重复使用代码,令代码简洁,易于扩展.例如:有一个sharp的类,这个类实现了sharp的一些方法,现在我们要写一个circle的 ...

  7. 将Excel中数据导入数据库(二)

    在上篇文章中介绍到将Excel中数据导入到数据库中,但上篇文章例子只出现了nvachar类型,且数据量很小.今天碰到将Excel中数据导入数据库中的Excel有6419行,其中每行均有48个字段,有i ...

  8. SimpleAdapter类使用方法

    SimpleAdapter的构造函数是: public SimpleAdapter (Context context, List<? extends Map<String, ?>&g ...

  9. 进制格式转换 c#

    Console.WriteLine());//即17是十六进制位 得到的结果是23 得到十进制数 将字符串转换成二进制 public static string mdFiveGet(string md ...

  10. java根据sessionid获取session

    import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpSession; /** * * Class ...