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

数据

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)
  {
   strGroup = null;
  
   if(strFld == null)
    return -1;
  
   char[] chData = strFld.ToCharArray();
   int nPos = 0;
   string strSplit = "a"; // 一般以a子字段为字段组区分
   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() == strSplit))
     nFound ++; // found   

    if (nFound == nIndex)
     strGroup += chData[nPos].ToString();
    if(nFound > nIndex)
     break;   
   }
   if(strGroup == null)
    return 0;
   return 1;
  }
  //获得字符的长度
  //
  private int GetCharLength(char ch)
  {
   int nLength = 0;
  
   if((short)ch < 0 || (short)ch  > 128)
   {
    nLength += 2;
   }
   else
   {
    nLength = nLength + 1;
   }
   return nLength;
  }

  public string strMarc
  {
   get
   {
    return m_strMarc;
   }
   set
   {
    m_strMarc = value;
   }

  }
 }
}

 

时间: 2024-08-01 14:25:07

C#写的读取ISO2709格式数据的DLL的相关文章

ArcGIS读取dem格式数据

DEM是GIS常用的一种数据,用来做各种分析.展示等,十分有用!它实质上就是一个栅格,只不过这个栅格值表示高程,常用的格式是tif,grid等.今天听到了另外一种说法:*.dem是最常见到的DEM的格式,*.dem有两种格式,NSDTF和USGS. USGS格式 USGS-DEM(USGS是美国地质调查局(U.S.Geological Survey)的英文缩写,是一种公开格式的DEM数据格式标准,使用范围较广格式的..通过ArcGIS可以直接读取,在ArcGIS中的ArcToolBox中的"转换

数据-C#读取特定格式的二进制文件

问题描述 C#读取特定格式的二进制文件 在学习的时候遇到了一点麻烦,读取一个二进制文件,这个二进制文件包含了很多相同结构的数据块,每个数据块以FFFF开头,以FFEE结尾,每个数据块长度为1024bytes.但是其中偶尔会出现错误数据,也就是数据块不完整,只有FFFF开头,没有FFEE结尾,这种数据块就不能用. 如果读取数据,就必须去验证.请问各位如何验证? 我本来想用BinaryReader读取,然后验证,但是BinaryReader读了数据就往前移动,就算验证成功了也得不到数据.请各位大神帮

网络编程-求一段从网站读取实时日线数据的vb代码,本人要把实时日线数据不断写进txt文件最后一行

问题描述 求一段从网站读取实时日线数据的vb代码,本人要把实时日线数据不断写进txt文件最后一行 谢谢各位大神!本人业余爱好,但是现在对网络编程不熟,求帮助! 日线数据直接读到一个字符串里面就好了,用空格或tab隔开都行 解决方案 这不是S吗?直接写到数据库的表里就好了

写入sql2005-vs2005中读取EXCEL表格数据

问题描述 vs2005中读取EXCEL表格数据 环境如下,vs2005,sql2005,EXCEL表格一个, 我需要通过VS2005编写一段C#代码,来从EXCEL表格中读取数据,再存入到sql2005表格中,哪位大神知道麻烦告诉下,代码写出来给我看,分数不吝啬,谢谢! 解决方案 这是以前做过的一个例子,你只看你需要的就可以了,这种方法首先要把数据库的格式设计成excel的格式 private void insertSQL_Click(object sender, EventArgs e) {

实例详解JSON数据格式及json格式数据域字符串相互转换_javascript技巧

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言.易于人阅读和编写,同时也易于机器解析和生成. 基础结构 JSON建构于两种结构: 1. "名称/值"对的集合(A collection of name/value pairs).不同的语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hash t

ajax 读取服务器端xml数据并解析xml

<html> <head> <title>ajax读取数据到表格</title> </head> <body> <input type="button" value="显示数据" onclick="post()" /> <script type="text/网页特效"> function ajax_xmlhttp(){ //在ie中

使用PHP生成和获取XML格式数据

在做数据接口时,我们通常要获取第三方数据接口或者给第三方提供数据接口,而这些数据格式通常是以XML或者JSON格式传输,本文将介绍如何使用PHP生成XML格式数据供第三方调用以及如何获取第三方提供的XML数据. 生成XML格式数据 我们假设系统中有一张学生信息表student,需要提供给第三方调用,并有id,name,sex,age分别记录学生的姓名.性别.年龄等信息.   CREATE TABLE `student` (    `id` int(11) NOT NULL auto_increm

PHP JSON格式数据交互实例详解

此前我写了不少在PHP网站开发中应用XML进行数据交互的实例,这两天通过PHP解析JSON并进行交互的实例学习和了解了JSON在PHP中的应用,感觉非常方便,在PHP中解析JSON主要用到json_encode和json_decode两个PHP JSON函数,比PHP解析XML方便很多,下面详细介绍下PHP JSON的使用. JSON基础介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. JSON主要有两种结构: "名称/值"对的集合,

PHP读取汉字点阵数据

汉字|数据 心血来潮,想模仿LCD的显示效果,写了个从点阵字库中提取汉字点阵数据的一段php脚本. 背景知识:简体中文国标字库(1981年订,中国大陆).7445个字符,其中汉字6773个,包括一级汉字3755个,二级汉字3008个.采用2字节(16位二进制)编码. 区位码:国标GB2312规定,所有的国标汉字与符号组成一个94×94的矩阵.在此方阵中,每一行称为一个"区",每一列称为一个"位",因此,这个方阵实际上组成了一个有94个区(区号分别为0 1到94).每