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. 鼎信通达gsm网关和asterisk对接的调试

    设备型号:4gsm卡,型号是DWG2000C-4Egsm网关IP地址: 10.3.6.250asteriskIP地址: 10.3.6.251 1)首先在asterisk里面添加到gsm网关的中继,并做 ...

  2. NPOI高效匯出Excel

    using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using NPOI. ...

  3. 20145305 《Java程序设计》第7周学习总结

    教材学习内容总结 1.只有Lambda表达式,参数的类型必须写出来,如果有目标类型,在编译程序可推断出类型的情况下,可以不写出 2.Lambda表达式本身是中性的,不代表任何类型的实例,可用来表示不同 ...

  4. (medium)LeetCode 238.Product of Array Except Self

    Given an array of n integers where n > 1, nums, return an array output such that output[i] is equ ...

  5. Unity项目在亚马逊KindleFire设备上旋转不正确的解决方案

    前提:      在亚马逊设备上,总部要求发布的版本必须使用LandscapeLeft方向.按照经验,在UnityPlayerSettings中设置Orientation即可.   问题表现:     ...

  6. 设置.Net多线程默认CultureInfo

    .net编码过程中,当我们新开一个线程时,其默认的CurrentCulture属性为当前系统的Culture,在软件的本地化没有完成的情况下,采用默认系统的文化编码方式,可能会导致软件在界面显示,数字 ...

  7. Flex 三态复选框

    在周末挤出了一点时间,写了一个三态复选框的组件,单独使用没有价值,不过集成到树之中可以很好的实现三态树,今天上午便把三态树组件也完成了,Flex自定义组件基本无所不能,此组件基于最新的Flex4.6( ...

  8. Ajax.BeginForm 上传文件

    在 Mvc 中上传文件时通常使用 Html.BeginForm 标签,同时对Form 添加属性 enctype = "multipart/form-data",前端代码如下: @H ...

  9. 动态链接库(VC_Win32)

    目录 动态链接库概述相关函数动态链接库编程dumpbin工具 (本章节中例子都是用 VS2005 编译调试的) 动态链接概述 说明 所谓动态链接,就是把一些经常会共用的代码(静态链接的OBJ程序库)制 ...

  10. (笔记)angular 包含关系的controller参数父级方法