一般而言,文本文件都只
会
包含一
种
格式(例如,以逗
号
分隔或是
固定字段
宽
度),然而文本文件却很可能含有多
种
格式,
当
遇到此
种状况时该
如何
处
理呢?
如果
您
的文本文件含有多
种
格式,
应该
使用
TextFieldParser
对
象的
PeekChars
方法去取得
数
据行
从头
算起特定
数
目的字符,以便藉此
来
判
断该数
据行的格式,然后告知
TextFieldParser
对
象
该数
据行的格式
为
何
并读
取
该数
据行。
PeekChars
方法只
会
返回指定
数
目的字符而且不
会
前
进
至下一行,通
过这样
逐一判
别
每一
笔数
据行的格式
并
逐行
读
取
数
据行的方式,即可
够
解析含有多
种
格式的文字文件
并顺
利
读
取。
举
例
来说
,假
设
我
们
在
应
用程序
项
目的
Text
文件
夹
含有一
个
名
称为
“多格式文本文件
.txt
”的文本文件,此文本文件的特殊之
处
在于
它
含有下列三
种
格式:
Ø
固定字段
宽
度分
别为
5
、
10
与
-1
的
数
据行。
Ø
固定字段
宽
度分
别为
6
、
10
、
17
与
-1
的
数
据行。
Ø
采用逗
号
分隔的
数
据行。
上述
这
三
种
格式的
数
据行存在一
个
特点,就是
数
据行的
开头
字符分
别
是
CK
、
PB
与
SP
,因此我
们
只要通
过
TextFieldParser
对
象的
PeekChars
方法取得
数
据行的前
两个
字符,然后根据其
值来设
定
TextFieldType
属
性,以及
设
定
Delimiters
属
性(或
调
用
SetDelimiters
方法)或
FieldWidths
属
性(或
调
用
SetFieldWidths
方法),
并
使用
ReadFields
方法
来读
取
数
据行。反
复
使用此方式
来处
理每一
笔数
据行,就能
够顺
利解析
并读
取整
个
文本文件。
以下的程序代
码
示范如何
将
“多格式文本文件
.txt
”中的三
种
格式
数
据解析出
来并
分
别显
示于各自的
DataGridView
控件中。相
关
程序代
码
列示如下:
private
void CH1_DemoForm035_Load(object sender, EventArgs e)
{
txtResult.Text = File.ReadAllText(@"Text\
多格式文本文件
.txt"
);
DataGridView1.ColumnHeadersVisible = true;
//
设定栏标题样式。
DataGridViewCellStyle columnHeaderStyle = new DataGridViewCellStyle();
columnHeaderStyle.BackColor = Color.Beige;
columnHeaderStyle.Font = new Font("Verdana", 9, FontStyle.Bold);
DataGridView1.ColumnHeadersDefaultCellStyle = columnHeaderStyle;
//
设定
DataGridView
控件的数据行数目。
DataGridView1.ColumnCount = 3;
//
设定各数据行的标题名称。
DataGridView1.Columns[0].Name = "
类别编号
"
;
DataGridView1.Columns[1].Name = "
类别名称
"
;
DataGridView1.Columns[2].Name = "
说明
"
;
DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
DataGridView2.ColumnHeadersVisible = true;
DataGridView2.ColumnHeadersDefaultCellStyle = columnHeaderStyle;
//
设定
DataGridView
控件的数据行数目。
DataGridView2.ColumnCount = 4;
//
设定各数据行的标题名称。
DataGridView2.Columns[0].Name = "
产品编号
"
;
DataGridView2.Columns[1].Name = "
产品名称
"
;
DataGridView2.Columns[2].Name = "
单位数量
"
;
DataGridView2.Columns[3].Name = "
单价
"
;
DataGridView2.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
DataGridView3.ColumnHeadersVisible = true;
DataGridView3.ColumnHeadersDefaultCellStyle = columnHeaderStyle;
//
设定
DataGridView
控件的数据行数目。
DataGridView3.ColumnCount = 3;
//
设定各数据行的标题名称。
DataGridView3.Columns[0].Name = "
货运公司编号
"
;
DataGridView3.Columns[1].Name = "
货运公司名称
"
;
DataGridView3.Columns[2].Name = "
电话
"
;
DataGridView3.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
}
private void btnParseTextFiles_Click(object sender, EventArgs e)
{
using (TextFieldParser myReader =
new TextFieldParser(@"Text\
多格式文本文件
.txt"
))
{
//
定义三种格式之各栏的宽度与分隔字符。
int[] FirstFormat = { 5, 10, -1 };
int[] SecondFormat = { 6, 10, 17, -1 };
string[] ThirdFormat = { "," };
this.DataGridView1.Rows.Clear();
this.DataGridView2.Rows.Clear();
this.DataGridView3.Rows.Clear();
string[] CurrentRow;
while (!myReader.EndOfData)
{
try
{
string RowType = myReader.PeekChars(2);
switch (RowType)
{
case "CK":
myReader.TextFieldType = FieldType.FixedWidth;
myReader.FieldWidths = FirstFormat;
//
或是
myReader.SetFieldWidths(FirstFormat);
CurrentRow = myReader.ReadFields();
this.DataGridView1.Rows.Add(CurrentRow);
break;
case "PB":
myReader.TextFieldType = FieldType.FixedWidth;
myReader.FieldWidths = SecondFormat;
//
或是
myReader.SetFieldWidths(SecondFormat);
CurrentRow = myReader.ReadFields();
this.DataGridView2.Rows.Add(CurrentRow);
break;
case "SP":
myReader.TextFieldType = FieldType.Delimited;
myReader.Delimiters = ThirdFormat;
//
或是
myReader.SetDelimiters(ThirdFormat);
CurrentRow = myReader.ReadFields();
this.DataGridView3.Rows.Add(CurrentRow);
break;
}
}
catch (MalformedLineException ex)
{
MessageBox.Show("
行
"
+ ex.Message + "
是无效的。略过。
"
);
}
}
//
排序各个
DataGridView
控件的内容。
DataGridView1.Sort(DataGridView1.Columns[0],
System.ComponentModel.ListSortDirection.Ascending);
DataGridView2.Sort(DataGridView2.Columns[0],
System.ComponentModel.ListSortDirection.Ascending);
DataGridView3.Sort(DataGridView3.Columns[0],
System.ComponentModel.ListSortDirection.Ascending);
}
}
请注意:
在使用
Visual Basic
的
My
对象(或是说
My
快捷方式)之前,必须先在项目中添加对
Microsoft.VisualBasic.dll
的引用,然后如下所示导入适当的命名空间:
using Microsoft.VisualBasic.Devices;
如此一来,就可以在
Visual C#
中使用与
My
相似的语法来撰写程序。
本文出自 “章立民” 博客,转载请与作者联系!