📄 dbasereader.cs
字号:
case 0x23: return System.Text.Encoding.GetEncoding(852); // Polish OEM
case 0x24: return System.Text.Encoding.GetEncoding(860); // Portuguese OEM
case 0x25: return System.Text.Encoding.GetEncoding(850); // Portuguese OEM secondary codepage
case 0x26: return System.Text.Encoding.GetEncoding(866); // Russian OEM
case 0x37: return System.Text.Encoding.GetEncoding(850); // English OEM (U.S.) secondary codepage
case 0x40: return System.Text.Encoding.GetEncoding(852); // Romanian OEM
case 0x4D: return System.Text.Encoding.GetEncoding(936); // Chinese GBK (PRC)
case 0x4E: return System.Text.Encoding.GetEncoding(949); // Korean (ANSI/OEM)
case 0x4F: return System.Text.Encoding.GetEncoding(950); // Chinese Big5 (Taiwan)
case 0x50: return System.Text.Encoding.GetEncoding(874); // Thai (ANSI/OEM)
case 0x57: return System.Text.Encoding.GetEncoding(1252); // ANSI
case 0x58: return System.Text.Encoding.GetEncoding(1252); // Western European ANSI
case 0x59: return System.Text.Encoding.GetEncoding(1252); // Spanish ANSI
case 0x64: return System.Text.Encoding.GetEncoding(852); // Eastern European MS朌OS
case 0x65: return System.Text.Encoding.GetEncoding(866); // Russian MS朌OS
case 0x66: return System.Text.Encoding.GetEncoding(865); // Nordic MS朌OS
case 0x67: return System.Text.Encoding.GetEncoding(861); // Icelandic MS朌OS
case 0x68: return System.Text.Encoding.GetEncoding(895); // Kamenicky (Czech) MS-DOS
case 0x69: return System.Text.Encoding.GetEncoding(620); // Mazovia (Polish) MS-DOS
case 0x6A: return System.Text.Encoding.GetEncoding(737); // Greek MS朌OS (437G)
case 0x6B: return System.Text.Encoding.GetEncoding(857); // Turkish MS朌OS
case 0x6C: return System.Text.Encoding.GetEncoding(863); // French朇anadian MS朌OS
case 0x78: return System.Text.Encoding.GetEncoding(950); // Taiwan Big 5
case 0x79: return System.Text.Encoding.GetEncoding(949); // Hangul (Wansung)
case 0x7A: return System.Text.Encoding.GetEncoding(936); // PRC GBK
case 0x7B: return System.Text.Encoding.GetEncoding(932); // Japanese Shift-JIS
case 0x7C: return System.Text.Encoding.GetEncoding(874); // Thai Windows/MS朌OS
case 0x7D: return System.Text.Encoding.GetEncoding(1255); // Hebrew Windows
case 0x7E: return System.Text.Encoding.GetEncoding(1256); // Arabic Windows
case 0x86: return System.Text.Encoding.GetEncoding(737); // Greek OEM
case 0x87: return System.Text.Encoding.GetEncoding(852); // Slovenian OEM
case 0x88: return System.Text.Encoding.GetEncoding(857); // Turkish OEM
case 0x96: return System.Text.Encoding.GetEncoding(10007); // Russian Macintosh
case 0x97: return System.Text.Encoding.GetEncoding(10029); // Eastern European Macintosh
case 0x98: return System.Text.Encoding.GetEncoding(10006); // Greek Macintosh
case 0xC8: return System.Text.Encoding.GetEncoding(1250); // Eastern European Windows
case 0xC9: return System.Text.Encoding.GetEncoding(1251); // Russian Windows
case 0xCA: return System.Text.Encoding.GetEncoding(1254); // Turkish Windows
case 0xCB: return System.Text.Encoding.GetEncoding(1253); // Greek Windows
case 0xCC: return System.Text.Encoding.GetEncoding(1257); // Baltic Windows
default:
return System.Text.Encoding.UTF7;
}
}
/// <summary>
/// Returns a DataTable that describes the column metadata of the DBase file.
/// </summary>
/// <returns>A DataTable that describes the column metadata.</returns>
public DataTable GetSchemaTable()
{
DataTable tab = new DataTable();
// all of common, non "base-table" fields implemented
tab.Columns.Add("ColumnName", typeof(System.String));
tab.Columns.Add("ColumnSize", typeof(Int32));
tab.Columns.Add("ColumnOrdinal", typeof(Int32));
tab.Columns.Add("NumericPrecision", typeof(Int16));
tab.Columns.Add("NumericScale", typeof(Int16));
tab.Columns.Add("DataType", typeof(System.Type));
tab.Columns.Add("AllowDBNull", typeof(bool));
tab.Columns.Add("IsReadOnly", typeof(bool));
tab.Columns.Add("IsUnique", typeof(bool));
tab.Columns.Add("IsRowVersion", typeof(bool));
tab.Columns.Add("IsKey", typeof(bool));
tab.Columns.Add("IsAutoIncrement", typeof(bool));
tab.Columns.Add("IsLong", typeof(bool));
foreach (DbaseField dbf in DbaseColumns)
tab.Columns.Add(dbf.ColumnName, dbf.DataType);
for (int i = 0; i < DbaseColumns.Length; i++)
{
DataRow r = tab.NewRow();
r["ColumnName"] = DbaseColumns[i].ColumnName;
r["ColumnSize"] = DbaseColumns[i].Length;
r["ColumnOrdinal"] = i;
r["NumericPrecision"] = DbaseColumns[i].Decimals;
r["NumericScale"] = 0;
r["DataType"] = DbaseColumns[i].DataType;
r["AllowDBNull"] = true;
r["IsReadOnly"] = true;
r["IsUnique"] = false;
r["IsRowVersion"] = false;
r["IsKey"] = false;
r["IsAutoIncrement"] = false;
r["IsLong"] = false;
// specializations, if ID is unique
//if (_ColumnNames[i] == "ID")
// r["IsUnique"] = true;
tab.Rows.Add(r);
}
return tab;
}
private SharpMap.Data.FeatureDataTable baseTable;
private void CreateBaseTable()
{
baseTable = new SharpMap.Data.FeatureDataTable();
foreach (DbaseField dbf in DbaseColumns)
baseTable.Columns.Add(dbf.ColumnName, dbf.DataType);
}
internal SharpMap.Data.FeatureDataTable NewTable
{
get { return baseTable.Clone(); }
}
internal object GetValue(uint oid, int colid)
{
if (!_isOpen)
throw (new ApplicationException("An attempt was made to read from a closed DBF file"));
if (oid >= _NumberOfRecords)
throw (new ArgumentException("Invalid DataRow requested at index " + oid.ToString()));
if (colid >= DbaseColumns.Length || colid < 0)
throw ((new ArgumentException("Column index out of range")));
fs.Seek(_HeaderLength + oid * _RecordLength, 0);
for (int i = 0; i < colid; i++)
br.BaseStream.Seek(DbaseColumns[i].Length,SeekOrigin.Current);
return ReadDbfValue(DbaseColumns[colid]);
}
private System.Text.Encoding _Encoding;
private System.Text.Encoding _FileEncoding;
/// <summary>
/// Gets or sets the <see cref="System.Text.Encoding"/> used for parsing strings from the DBase DBF file.
/// </summary>
/// <remarks>
/// If the encoding type isn't set, the dbase driver will try to determine the correct <see cref="System.Text.Encoding"/>.
/// </remarks>
public System.Text.Encoding Encoding
{
get { return _Encoding; }
set { _Encoding = value; }
}
/// <summary>
/// Gets the feature at the specified Object ID
/// </summary>
/// <param name="oid"></param>
/// <param name="table"></param>
/// <returns></returns>
internal SharpMap.Data.FeatureDataRow GetFeature(uint oid, SharpMap.Data.FeatureDataTable table)
{
if (!_isOpen)
throw (new ApplicationException("An attempt was made to read from a closed DBF file"));
if (oid >= _NumberOfRecords)
throw (new ArgumentException("Invalid DataRow requested at index " + oid.ToString()));
fs.Seek(_HeaderLength + oid * _RecordLength,0);
SharpMap.Data.FeatureDataRow dr = table.NewRow();
if (br.ReadChar() == '*') //is record marked deleted?
return null;
for (int i = 0; i < DbaseColumns.Length;i++ )
{
DbaseField dbf = DbaseColumns[i];
dr[dbf.ColumnName] = ReadDbfValue(dbf);
}
return dr;
}
private object ReadDbfValue(DbaseField dbf)
{
switch (dbf.DataType.ToString())
{
case "System.String":
if(_Encoding==null)
return _FileEncoding.GetString(br.ReadBytes(dbf.Length)).Replace("\0", "").Trim();
else
return _Encoding.GetString(br.ReadBytes(dbf.Length)).Replace("\0", "").Trim();
case "System.Double":
string temp = System.Text.Encoding.UTF7.GetString(br.ReadBytes(dbf.Length)).Replace("\0", "").Trim();
double dbl = 0;
if(double.TryParse(temp, System.Globalization.NumberStyles.Float, SharpMap.Map.numberFormat_EnUS, out dbl))
return dbl;
else
return DBNull.Value;
case "System.Int16":
string temp16 = System.Text.Encoding.UTF7.GetString((br.ReadBytes(dbf.Length))).Replace("\0", "").Trim();
Int16 i16 = 0;
if (Int16.TryParse(temp16, System.Globalization.NumberStyles.Float, SharpMap.Map.numberFormat_EnUS, out i16))
return i16;
else
return DBNull.Value;
case "System.Int32":
string temp32 = System.Text.Encoding.UTF7.GetString((br.ReadBytes(dbf.Length))).Replace("\0", "").Trim();
Int32 i32 = 0;
if (Int32.TryParse(temp32, System.Globalization.NumberStyles.Float, SharpMap.Map.numberFormat_EnUS, out i32))
return i32;
else
return DBNull.Value;
case "System.Int64":
string temp64 = System.Text.Encoding.UTF7.GetString((br.ReadBytes(dbf.Length))).Replace("\0", "").Trim();
Int64 i64 = 0;
if (Int64.TryParse(temp64, System.Globalization.NumberStyles.Float, SharpMap.Map.numberFormat_EnUS, out i64))
return i64;
else
return DBNull.Value;
case "System.Single":
string temp4 = System.Text.Encoding.UTF8.GetString((br.ReadBytes(dbf.Length)));
float f = 0;
if (float.TryParse(temp4, System.Globalization.NumberStyles.Float, SharpMap.Map.numberFormat_EnUS, out f))
return f;
else
return DBNull.Value;
case "System.Boolean":
char tempChar = br.ReadChar();
return ((tempChar == 'T') || (tempChar == 't') || (tempChar == 'Y') || (tempChar == 'y'));
case "System.DateTime":
DateTime date;
// Mono has not yet implemented DateTime.TryParseExact
#if !MONO
if (DateTime.TryParseExact(System.Text.Encoding.UTF7.GetString((br.ReadBytes(8))),
"yyyyMMdd", SharpMap.Map.numberFormat_EnUS, System.Globalization.DateTimeStyles.None, out date))
return date;
else
return DBNull.Value;
#else
try
{
return date = DateTime.ParseExact ( System.Text.Encoding.UTF7.GetString((br.ReadBytes(8))),
"yyyyMMdd", SharpMap.Map.numberFormat_EnUS, System.Globalization.DateTimeStyles.None );
}
catch ( Exception e )
{
return DBNull.Value;
}
#endif
default:
throw (new NotSupportedException("Cannot parse DBase field '" + dbf.ColumnName + "' of type '" + dbf.DataType.ToString() + "'"));
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -