1
using
System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace ISO2709
7 {
8 public class MarcHandler
9 {
10 private const char 记录分隔符 = ( char ) 29 ;
11 private const char 字段分隔符 = ( char ) 30 ;
12 private const char 子字段分隔符 = ( char ) 31 ;
13
14 private const int 头标区长度 = 24 ;
15 private const int 字段长度 = 12 ;
16
17
18
19 public string Record;
20 public MarcHandler( string Record)
21 {
22 this .Record = Record;
23 }
24
25
26 private Record SingleRecordHandler( string Record)
27 {
28 var result = new Record();
29
30 int 记录总长度;
31 int 数据基地址; // 目次区结束位置
32
33
34 int 目次区长度;
35 string 目次区内容; // 每个12位:字段标识符(3) 字段长度(4) 字段起始地址(5) ; 字段标识符 应查找对应字段名
36
37 int 字段个数;
38 int 字段标识符;
39
40 int 数据区长度;
41 string 数据区内容; // 个数对应 目次区中的字段个数
42
43 string [] 数据字段数组;
44 string [] 数据子字段数组;
45
46 int i;
47 string [] tmp;
48
49 记录总长度 = Record.Substring( 0 , 4 );
50 数据基地址 = Record.Substring( 12 , 5 );
51
52 目次区长度 = 数据基地址 - 头标区长度 + 1 ;
53 目次区内容 = Record.Substring(头标区长度, 目次区长度);
54 字段个数 = 目次区长度 / 字段长度;
55
56 数据区长度 = 记录总长度 - 数据基地址;
57 数据区内容 = Record.Substring(数据基地址, 数据区长度);
58
59 // 配置文件:数字与字段名映射(01-ISBN,010-出版社等)
60 // 1.得到所有字段标识符
61 // 2.取得数据区内容与目次区字段标识符的对应字段构建Table(依次对应,注意有子字段,通过"子字段分隔符"分隔)
62 // 3.如果"字段标识符"的数字与配置文件中的数字相同,设置实体类Record中相应字段的值
63
64 return result;
65 }
66
67 public IEnumerable < Record > RecordSplit()
68 {
69 var result = new List < Record > () ;
70
71 var RecordList = Record.Split(记录分隔符);
72 foreach (var r in RecordList)
73 {
74 result.Add(SingleRecordHandler(Record));
75 }
76 }
77
78 public void ToExcel()
79 {
80 foreach (var r in RecordSplit())
81 {
82 // 导出到Excel
83 }
84 }
85
86 }
87
88 public class Record
89 {
90 public string ISBN { set ; get ; }
91 public string 出版社 { set ; get ; }
92 // 自己添加
93 }
94 }
95
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace ISO2709
7 {
8 public class MarcHandler
9 {
10 private const char 记录分隔符 = ( char ) 29 ;
11 private const char 字段分隔符 = ( char ) 30 ;
12 private const char 子字段分隔符 = ( char ) 31 ;
13
14 private const int 头标区长度 = 24 ;
15 private const int 字段长度 = 12 ;
16
17
18
19 public string Record;
20 public MarcHandler( string Record)
21 {
22 this .Record = Record;
23 }
24
25
26 private Record SingleRecordHandler( string Record)
27 {
28 var result = new Record();
29
30 int 记录总长度;
31 int 数据基地址; // 目次区结束位置
32
33
34 int 目次区长度;
35 string 目次区内容; // 每个12位:字段标识符(3) 字段长度(4) 字段起始地址(5) ; 字段标识符 应查找对应字段名
36
37 int 字段个数;
38 int 字段标识符;
39
40 int 数据区长度;
41 string 数据区内容; // 个数对应 目次区中的字段个数
42
43 string [] 数据字段数组;
44 string [] 数据子字段数组;
45
46 int i;
47 string [] tmp;
48
49 记录总长度 = Record.Substring( 0 , 4 );
50 数据基地址 = Record.Substring( 12 , 5 );
51
52 目次区长度 = 数据基地址 - 头标区长度 + 1 ;
53 目次区内容 = Record.Substring(头标区长度, 目次区长度);
54 字段个数 = 目次区长度 / 字段长度;
55
56 数据区长度 = 记录总长度 - 数据基地址;
57 数据区内容 = Record.Substring(数据基地址, 数据区长度);
58
59 // 配置文件:数字与字段名映射(01-ISBN,010-出版社等)
60 // 1.得到所有字段标识符
61 // 2.取得数据区内容与目次区字段标识符的对应字段构建Table(依次对应,注意有子字段,通过"子字段分隔符"分隔)
62 // 3.如果"字段标识符"的数字与配置文件中的数字相同,设置实体类Record中相应字段的值
63
64 return result;
65 }
66
67 public IEnumerable < Record > RecordSplit()
68 {
69 var result = new List < Record > () ;
70
71 var RecordList = Record.Split(记录分隔符);
72 foreach (var r in RecordList)
73 {
74 result.Add(SingleRecordHandler(Record));
75 }
76 }
77
78 public void ToExcel()
79 {
80 foreach (var r in RecordSplit())
81 {
82 // 导出到Excel
83 }
84 }
85
86 }
87
88 public class Record
89 {
90 public string ISBN { set ; get ; }
91 public string 出版社 { set ; get ; }
92 // 自己添加
93 }
94 }
95
Marc数据格式:(记录分隔符分隔)
1.记录头标区:24 位,0 - 4位字符为该记录的总长度 ,1 2 -1 6位为数据基地址。它的值等于头标区长度与目次区长度之和,即数据基地址-24=目次区长度;相当于表信息
2.目次区:12位*n个 组成 (字段分隔符分隔) , 字段标识符(3) 字段长度(4) 字段起始地址(5);相当于列名
3.数据区:目次区字段名所对应的值,(字段分隔符分隔,其中包含的子字段由子字段分隔符分隔);相当于值