分享
 
 
 

C#写的读取ISO2709格式数据的DLL

王朝c#·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

using System;

using System.Collections;

/*

此类的功能,是读取ISO2709数据

得到ISO2709数据三个段,头标\目次\数据

获得字段信息

获得子字段信息

*/

namespace Nosi.Library

{

/// <summary>

/// Class1 的摘要说明。

/// </summary>

public class Marc

{

#region 常量定义

public const char FLDEND = (char)30; // 字段结束符

public const char RECEND = (char)29; // 记录结束符

public const char SUBFLD = (char)31; // 子字段指示符

public const int FLDNAME_LEN = 3; // 字段名长度

public const int MAX_MARCREC_LEN = 100000; // MARC记录的最大长度

#endregion

string m_strMarc = ""; // MARC记录体

public Marc()

{

//

// TODO: 在此处添加构造函数逻辑

//

}

//获得头标

private string GetHeader()

{

string strHeader = null;

strHeader = m_strMarc.Substring(0,24);

return strHeader;

}

//获得目次

private string GetMuci()

{

char[] charr = m_strMarc.ToCharArray();

string strMuci = null;

int i = 24; // 头标字符不再读取

while(i < m_strMarc.Length)

{

strMuci += charr[i].ToString();

if(charr[i] == FLDEND) break; //发现字段标识

i++;

}

return strMuci;

}

// 获得数据区

private string GetData()

{

string strData = null;

int iMuci = this.GetMuci().Length;

int iHeader = this.GetHeader().Length;

int iMarc = m_strMarc.Length;

strData = m_strMarc.Substring(iMuci + iHeader,iMarc - iMuci - iHeader);

return strData;

}

// 获得目次区中的字段名

// -1 error

// 0 no found

// 1 found

private int GetFieldPos(string strFieldName,

int nIndex,

out string strFieldPos)

{

string strMuci = this.GetMuci();

strFieldPos = null;

int i = 0;

int nRet = 0;

if(strMuci == null)

return -1;

if((strMuci.Length - 1) % 12 != 0) // 减1是由于目次区结束标识符

return -1; // length error

do

{

if(strMuci.Substring(i,3) == strFieldName)

nRet ++;

if(nRet == nIndex)// from zero add

{

strFieldPos = strMuci.Substring(i,12);

break;

}

i += 12;

} while(i<strMuci.Length);

if (strFieldPos == null)

return 0; // no found

return 1;

}

// 通过字段名,字段中出现次数获得字段内容

// 次数从 1 开始计数

// -1 error

// 0 no found

// 1 found

public int GetField(string strFldName,

int nIndex,

out string strFld)

{

strFld = null;

string strFldPos = null;

int nRet = this.GetFieldPos(strFldName,nIndex,out strFldPos);

if (nRet != 1)

return nRet;

if(strFldName.Length != 3 )

return -1; // subfield must 3 chars

int nLength = int.Parse( strFldPos.Substring(3,4));

int nBeginPos = int.Parse( strFldPos.Substring(7,5));

char[] chData = this.GetData().ToCharArray();

int nPos =0;

int i = 0;

while( nPos < chData.Length)

{

i += GetCharLength(chData[nPos]);

if((i >= nBeginPos) && i<= (nBeginPos + nLength))

strFld += chData[nPos].ToString();

nPos ++;

}

if(strFld == null)

return 0;

return 1;

}

//从字段中获得出现次数的子字段

// -1 error

// 0 not found

// 1 found

public int GetSubField(string strFld,

string strSubName,

int nIndex,

out string strSubFld)

{

strSubFld = null;

if(strSubName.Length != 1)

return -1; // subfield'symbol char must 1 char

if(strFld == null)

return -1;

char[] chData = strFld.ToCharArray();

int nPos = 0;

bool isNewSub = false;

int nFound = 0; // 0: not 1: first time found 2: second time found

while( nPos < chData.Length)

{

nPos ++;

if((chData[nPos-1] == SUBFLD) && (chData[nPos].ToString() == strSubName))

nFound ++; // found

if ((nFound == nIndex) && (isNewSub == false))

{

if(chData[nPos] == SUBFLD)

{

isNewSub = true;

break;

}

strSubFld += chData[nPos].ToString();

}

}

if(strSubFld == null)

return 0;

return 1;

}

//从字段组中获得子字段

// -1 error

// 0 not found

// 1 found

public int GetSubField(string strGroup,

string strSubName,

out string strSubFld)

{

strSubFld = null;

if(strSubName.Length != 1)

return -1; // subfield'symbol char must 1 char

if(strGroup == null)

return -1;

char[] chData = strGroup.ToCharArray();

int nPos = 0;

bool isNewSub = false;

int nFound = 0; // 0: not 1: first time found 2: second time found

while( nPos < chData.Length)

{

nPos ++;

if((chData[nPos-1] == SUBFLD) && (chData[nPos].ToString() == strSubName))

nFound ++; // found

if (isNewSub == false)

{

if(chData[nPos] == SUBFLD)

{

isNewSub = true;

break;

}

strSubFld += chData[nPos].ToString();

}

}

if(strSubFld == null)

return 0;

return 1;

}

//从字段中获得出现次数字段组

// -1 error

// 0 not found

// 1 found

public int GetFieldGroup(string strFld,

int nIndex,

out string strGroup)

{

strGro

[1] [2] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有