社区
C#
帖子详情
c# 转换marc 数据
longjxchina
2008-05-29 05:44:29
用c# 转换marc数据,再将转换后的数据保存到数据库里面。
...全文
324
3
打赏
收藏
c# 转换marc 数据
用c# 转换marc数据,再将转换后的数据保存到数据库里面。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
XIAOCONGCN
2009-01-05
打赏
举报
回复
研究,试试
longjxchina
2008-05-30
打赏
举报
回复
非常感谢。
yangshun2008
2008-05-29
打赏
举报
回复
自己研究一下吧:
public class exeMarc
{
private static StreamReader FileReadStream;
private static System.IO.FileStream CheckStream;
private static string FilePath;
public exeMarc()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public DataTable MarcTodt(string Path)
{
DataTable dt = new DataTable();
DataColumn ISBN=new DataColumn("ISBN",System.Type.GetType("System.String"));
dt.Columns.Add(ISBN);
dt.Columns.Add("ID",System.Type.GetType("System.String"));
DataColumn ID=new DataColumn("ID",System.Type.GetType("System.String"));
dt.Columns.Add("书名",System.Type.GetType("System.String"));
dt.Columns.Add("Author",System.Type.GetType("System.String"));
dt.Columns.Add("Price",System.Type.GetType("System.String"));
dt.Columns.Add("Press",System.Type.GetType("System.String"));
dt.Columns.Add("PressYear",System.Type.GetType("System.String"));
dt.Columns.Add("Abstract",System.Type.GetType("System.String"));
//dt.Columns.Add("Number",
DataColumn[] pris=new DataColumn[1];
CheckStream=new FileStream(Path,FileMode.Open,FileAccess.Read,FileShare.Read);
FileReadStream=new StreamReader(Path,System.Text.Encoding.Default);
FilePath =Path;
string BuffStr;
int CurrLine = 1;
while ((int)(FileReadStream.Peek()) >= 0)
{
try
{
BuffStr = FileReadStream.ReadLine();//读取FileReadStream中一行字符,并赋值给BuffStr
if(BuffStr.Length > 0)
{
dt.Rows.Add(GetData(BuffStr)); //加入到dt中
CurrLine++;
}
}
catch
{
CurrLine--;
}
}
FileReadStream.Close();
dt.TableName =Path;
return dt;
}
private string[] GetData(string Buff)
{
if (Buff.Length == 0)
{
return new string[8];
}
string ID = "无"; //识别码
string BookName = "无"; //书名
string Author = "无"; //作者
string ISBN = "无"; //ISBN
string Price = "无"; //价格
string Press = "无"; //出版社
string PressYear = "无"; //出版年
string Abstract = "无"; //摘要
int IndexLen = int.Parse(Buff.Substring(12, 5)) - 25;
string IndexRecord = Buff.Substring(24, IndexLen); //目次区内容
int Data_Address = int.Parse(Buff.Substring(12, 5)); //数据区地址
//ISBN
ISBN = GetRecord(Buff, "010", "a", IndexRecord, Data_Address).Trim();
//识别码
ID = GetRecord(Buff, "001", "", IndexRecord, Data_Address).Trim();
//书名
BookName = GetRecord(Buff, "200", "a", IndexRecord, Data_Address).Trim();
//作者
Author = GetRecord(Buff, "200", "f", IndexRecord, Data_Address).Trim();
//价格
Price = GetRecord(Buff, "010", "d", IndexRecord, Data_Address).Trim();
//出版社
Press = GetRecord(Buff, "210", "c", IndexRecord, Data_Address).Trim();
//出版年
PressYear = GetRecord(Buff, "210", "d", IndexRecord, Data_Address).Trim();
//摘要
Abstract = GetRecord(Buff, "330", "a", IndexRecord, Data_Address).Trim();
string[] ret = {ISBN,ID, BookName, Author, Price, Press, PressYear, Abstract};
return ret;
}
/// <summary>
/// 返回Buff中的字段号为 Member, 子字段号为 ZiMember 的数据
/// </summary>
/// <param name="Buff"></param>
/// <param name="Member">字段号</param>
/// <param name="SubMember">子字段号</param>
/// <param name="Data_Addr">地址区基地址</param>
/// <returns></returns>
public string GetRecord(string Buff, string Member, string SubMember, string IndexRecord, int Data_Addr)
{
string temp1 = ((char)30).ToString(); //子记录分隔符
string temp2 = ((char)31).ToString(); //子字段分隔符
if (SubMember != "")
{
SubMember = temp2 + SubMember;
}
string SubMbrData = "";
int Address;
int Len;
string Sub;
int SubMbrIndex;
int SubMbrLen;
for (int i = 0; i < IndexRecord.Length / 12; i++)
{
if (Member == IndexRecord.Substring(i * 12, 3))
{
//子记录相对于数据区偏移地址
Address = int.Parse(IndexRecord.Substring(i * 12 + 7, 5));
//子记录长度
Len = int.Parse(IndexRecord.Substring(i * 12 + 3, 4));
//子记录数据
int test = GetOffSet(Buff, 0, Address + Data_Addr);
Len -= GetOffSet(Buff, Data_Addr + Address - test, Data_Addr + Address - test + Len);
Sub = Buff.Substring(Data_Addr + Address - test, Len);
int a=Sub.Length;
test = Sub.IndexOf(temp2);
if (Sub.IndexOf(temp2) == Sub.Length - 1)
{
//如果该子记录无子字段
return Sub.Substring(0, Sub.Length - 1);
}
//子字段开始位置0
SubMbrIndex = Sub.IndexOf(SubMember) + SubMember.Length;
//子字段长度
int test11 = Sub.IndexOf(temp2, SubMbrIndex + 2);
bool IsEnd = (Sub.IndexOf(temp2, SubMbrIndex) == -1);
if (! IsEnd)
{
SubMbrLen = Sub.IndexOf(temp2, SubMbrIndex) - SubMbrIndex;
}
else
{
SubMbrLen = Sub.IndexOf(temp1, SubMbrIndex) - SubMbrIndex;
}
//子字段数据
int NextIndex = Sub.IndexOf(temp2, SubMbrIndex + 1); //下一个子字段分隔符的位置
if (NextIndex == -1)
{
SubMbrData = Sub.Substring(SubMbrIndex, SubMbrLen);
}
else
{
SubMbrData = Sub.Substring(SubMbrIndex, SubMbrLen);
}
break;
}
}
char [] test22 = SubMbrData.ToCharArray();
return SubMbrData;
}
/// <summary>
/// 计算由汉字引起的偏移地址误差,返回汉字个数
/// </summary>
///<param name="Buff">待统计的字符串</param>
///<param name="StartIndex">开始位置</param>
///<param name="EndIndex">截至位置</param>
/// <returns></returns>
public int GetOffSet(string Buff, int StartIndex, int EndIndex)
{
char[] temp = Buff.ToCharArray();
int LetterCount = 0, HanZiCount = 0;
for (int i = StartIndex; i < EndIndex; i++)
{
int test = (int)temp[i];
if (test < 128)
{
LetterCount++;
}
else
{
HanZiCount++;
}
if (HanZiCount * 2 + LetterCount == EndIndex - StartIndex)
{
return HanZiCount;
}
}
return HanZiCount;
}
}
相关推荐
图书m
arc
数据
下载(国图 calis cip)
图书编目m
arc
数据
套录神器 命中率99%。采用RemObjects、Data Abstract三层框架开发。客户端包含国图、calis、新书采访(cip)批套,国家图书馆opac.nlc.cn网页批套以及网页下载。客户端 自动升级,包含实用的m
arc
批处理工具 如 isbn
转换
、m
arc
转xls等。本软件 支持unicode m
arc
下载及存储。
再谈
转换
m
arc
数据
的体会---读取m
arc
数据
今天CSDN上的网友乐悠悠要做对m
arc
数据
的检索,不嫌我技术低下,在blog上留言问我。我也不怕大家笑话,再写一篇m
arc
的读取文章:) 首先要说的,无论是什么读或写m
arc
数据
,都必须吃透m
arc
的
数据
格式。如果是cnm
arc
的格式,强烈建议参考《中国机读目录格式使用手册》,对格式的讲解很详细,保证事半功倍,根本不用看我在这里罗嗦。读取,就分2步,一读,一取。
java-图书M
arc
文件导入处理
本教程仅做个人工作笔记,可能不适用于他人的工作/学习 图书系统,需要导入文件来生成图书
数据
,其中除了Excel、Word,还有一种M
arc
文件(不懂的时候觉得这东西特恶心,稍微懂了之后觉得这玩意很不错,nice) 先给一份大致的M
arc
文件代号的对应释义,来自百度文库 m
arc
另外附上三位前辈的博客,可以对m
arc
有一个大概的了解 M
ARC
数据
读取简单介绍 再谈
转换
m
arc
数据
的体会—读取ma...
R语言从入门到精通系列之
数据
对象
本篇首先对
数据
对象进行概要,并介绍了is判别函数和as
转换
函数;介绍常用的几个时间变量
转换
函数;详细介绍了向量的创建,向量化操作,常用序列的创建和向量子集提取;并介绍因子、矩阵和数组、列表和
数据
框的创建方法,每个小知识点通过小案例的详解讲解加深大家对不同
数据
对象的了解。
面向对象
C#
初级入门精讲(5)面向对象
面向对象
C#
初级入门精讲视频教程,该课程内容涵盖1、类的继承,包括理解继承的概念、存在继承关系的构造方法执行过程、隐藏基类的方法、装箱与拆箱、sealed关键字的作用2、多态的实现,包括重写父类方法、多态的实现、base关键字、里氏
转换
原则及Object类3、抽象类与接口的使用4、异常的处理方法,包括try……catch和finally5、理解命名空间的含义6、程序集的意义及其应用7、理解
C#
7.0的9个新特性
C#
109,416
社区成员
642,690
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者