zoukankan      html  css  js  c++  java
  • 读取SHP文件中的dbf表

    代码
      1 using System;
      2 using System.Collections.Generic;
      3 using System.Text;
      4 using System.Data;
      5 using System.IO;
      6 
      7 namespace ReadDbfTest
      8 {
      9     /// <summary>
     10     /// 一个代表DBF文件的类。
     11     /// editted by ice 
     12     /// hbhbice#gmail.com(@)
     13     /// </summary>
     14     public  class DBaseFile
     15     {
     16         #region Private Members
     17 
     18         /// <summary>
     19         /// 文件版本
     20         /// </summary>
     21         private string _Version;
     22         /// <summary>
     23         /// 文件修改日期
     24         /// </summary>
     25         private string _ModifyDate;
     26         /// <summary>
     27         /// 记录条数
     28         /// </summary>
     29         private int _RecordCount;
     30         /// <summary>
     31         /// 文件头字节数
     32         /// </summary>
     33         private Int16 _FileHeadLength;
     34         /// <summary>
     35         /// 一条记录的字节长度
     36         /// </summary>
     37         private Int16 _RecordLength;
     38         /// <summary>
     39         /// 文件的记录数据
     40         /// </summary>
     41         private DataTable _Table;     
     42         /// <summary>
     43         /// Language Drive ID 我也没有查到它到底是做什么的
     44         /// </summary>
     45         private int _LanguageDriveID;   
     46         #endregion
     47 
     48 
     49         #region Property
     50  
     51         /// <summary>
     52         /// 文件版本
     53         /// </summary>
     54         public string Version
     55         {
     56             get
     57             {
     58                 return _Version;
     59             }
     60             set
     61             {
     62                 _Version = value;
     63             }
     64         }
     65 
     66         /// <summary>
     67         /// 文件修改日期
     68         /// </summary>
     69         public string ModifyDate
     70         {
     71             get
     72             {
     73                 return _ModifyDate;//throw new System.NotImplementedException();
     74             }
     75             set
     76             {
     77                 _ModifyDate = value;
     78             }
     79         }
     80 
     81         /// <summary>
     82         /// 记录条数
     83         /// </summary>
     84         public int RecordCount
     85         {
     86             get
     87             {
     88                 return _RecordCount;//throw new System.NotImplementedException();
     89             }
     90             set
     91             {
     92                 _RecordCount = value;
     93             }
     94         }
     95 
     96         /// <summary>
     97         /// 一条记录的字节长度
     98         /// </summary>
     99         public short RecordLength
    100         {
    101             get
    102             {
    103                 return _RecordLength;//throw new System.NotImplementedException();
    104             }
    105             set
    106             {
    107                 _RecordLength = value;
    108             }
    109         }
    110 
    111         /// <summary>
    112         /// 文件的记录数据
    113         /// </summary>
    114         public DataTable Table
    115         {
    116             get
    117             {
    118                 return _Table; //throw new System.NotImplementedException();
    119             }
    120             set
    121             {
    122                 _Table = value;
    123             }
    124         }
    125 
    126        
    127         #endregion
    128 
    129         public DBaseFile()
    130         {
    131             this._Table = new DataTable();
    132         }
    133         /// <summary>
    134         /// 将文件的数据读到类中
    135         /// </summary>
    136         /// 
    137         public void Read(string FileName)
    138         {
    139             try 
    140             {            
    141                 FileStream fs = new FileStream (FileName ,FileMode.Open );
    142                 BinaryReader br = new BinaryReader (fs);
    143                 #region Read File Head
    144                 
    145                 Version = br.ReadByte().ToString();
    146                 byte yy = br.ReadByte();
    147                 byte mm = br.ReadByte();
    148                 byte dd = br.ReadByte();
    149                 ModifyDate = ((int)yy + 1900).ToString() + " " + mm.ToString() + " " + dd.ToString();
    150                 RecordCount = br.ReadInt32();
    151                 _FileHeadLength = br.ReadInt16();
    152                 RecordLength = br.ReadInt16();
    153 
    154                 for (int i = 0; i < 17; i++)
    155                 {
    156                     byte temp1 = br.ReadByte();
    157                 }   //读了29个字节,因为从1开始,所以下一个为整个文件的第29个字节
    158                 //以下为文件的第29个字节
    159                 _LanguageDriveID =(int) br.ReadByte();
    160 
    161                 br.ReadByte();
    162                 br.ReadByte(); //读完32个字节,以下便 是记录的描述了。
    163 
    164                 int ColumnCount = (_FileHeadLength - 33/ 32;
    165 
    166                 int[] RecordItemLength = new int[ColumnCount];
    167 
    168                 for (int i = 0; i < ColumnCount ; i++)
    169                 {
    170                     string strName = "";   // 11个字节记录项名称,是ASCII码值。
    171  
    172                     for (int k = 0; k < 11; k++)
    173                     {
    174                         char[] Name = new char[11];
    175                         Name[k] = (char)br.ReadByte();
    176                         strName = strName + Name[k];
    177                     }
    178                     char DataType = (char)br.ReadByte();  //记录项记录类型
    179                     int temp2 = br.ReadInt32();           //四个保留字,用0添写
    180                     RecordItemLength[i] = (int)br.ReadByte();  //记录项长度
    181                     Int16 RecordItemPrecision = (Int16)br.ReadByte(); //记录项的精度
    182                     Int16 temp3 = br.ReadInt16();     //2个字节保留字节
    183  
    184                     Int16 WorkspaceID = (Int16)br.ReadByte(); //1个字节工作区ID
    185  
    186                     for (int j = 0; j < 5; j++)  //10个字节保留字节
    187  
    188                     {
    189                         Int16[] temp = new Int16[5];
    190                         temp[j] = br.ReadInt16();
    191                     }
    192                     byte MDXFlag = br.ReadByte();  // 1个字节MDX标识
    193                     DataColumn dc =null;
    194                     switch (DataType )
    195                     {
    196 
    197                         case 'C':  //字符型  允许输入各种字符
    198                             dc = new DataColumn(strName);
    199                             dc.DataType = Type.GetType("System.String");
    200                             this._Table.Columns.Add(dc);
    201                             break;
    202                         case 'N':  //数值型(Numeric)
    203                             dc = new DataColumn (strName );
    204                             dc.DataType = Type.GetType("System.String");
    205                             //dc.DataType =Type.GetType ("System.Double" );
    206                             this._Table.Columns.Add(dc);
    207                             break;   
    208                         case 'F':
    209                             dc = new DataColumn(strName);
    210                             dc.DataType = Type.GetType("System.String");
    211                             this._Table.Columns.Add(dc);
    212                             break;
    213                         case 'D':  //日期型  用于区分年、月、日的数字和一个字符,内部存储按照YYYYMMDD格式。
    214                             throw new  NotImplementedException ();
    215                         case 'G':  //General or OLE                            
    216                             throw new NotImplementedException();  
    217 
    218                         case 'B':  //二进制 允许输入各种字符
    219                             throw new NotImplementedException(); 
    220                         case 'L':
    221                             throw new NotImplementedException(); 
    222                         case 'M':
    223                             throw new NotImplementedException(); 
    224                         default:
    225                             throw new NotImplementedException(); 
    226                     }
    227                     
    228                 }
    229                 char RecordTerminalTag = (char)br.ReadByte();  //1个字节作为记录项终止标识。
    230                 #endregion
    231                 
    232                 #region 读记录体
    233                 
    234                 for (int jj = 0; jj < RecordCount ; jj++)
    235                 {
    236 
    237                     //byte []temp111 = br.ReadBytes (71);
    238                     char tempchar=(char)    br.ReadByte();  //每个记录的开始都有一个空格
    239                     DataRow dr = _Table.NewRow();
    240                     for (int i = 0; i < ColumnCount; i++)
    241                     {
    242                         byte[] temp = br.ReadBytes(RecordItemLength[i]);
    243                         //dr[i] = UnicodeEncoding.Unicode.GetString(temp);
    244                         dr[i] = Encoding.Default.GetString(temp).Trim ();
    245                     }
    246                     _Table.Rows.Add(dr); 
    247                 }
    248                 
    249                 #endregion
    250 
    251 
    252                 while (br.BaseStream.Position < br.BaseStream.Length)
    253                 {
    254                     byte b = br.ReadByte();
    255                 }
    256 
    257             }
    258             catch (Exception ex) 
    259             {
    260                 
    261                 throw ex;
    262             }
    263 
    264             //throw new System.NotImplementedException();
    265         }
    266     }
    267 }
    268 
  • 相关阅读:
    云计算的三种服务模式:IaaS, PaaS, SaaS
    Docker 容器备份例子
    软件版本号
    git 命令小总结
    【Oracle】ORA-12560: TNS: 协议适配器错误
    【VMware】The VMX process exited permaturely
    Linux(CentOS)安装SQL Server
    Linux源码编译安装httpd
    Linux安装MySQL
    Linux安装Tomcat
  • 原文地址:https://www.cnblogs.com/hbhbice/p/1738072.html
Copyright © 2011-2022 走看看