完整程式碼:三種格式解析顯示於 DataGridView
private void CH1_DemoForm035_Load(object sender, EventArgs e)
{
txtResult.Text = File.ReadAllText(@"Text\多格式文字檔.txt");
// 設定三個 DataGridView 欄位標題、樣式、自動調整寬度...
}
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;
CurrentRow = myReader.ReadFields();
this.DataGridView1.Rows.Add(CurrentRow);
break;
case "PB":
myReader.TextFieldType = FieldType.FixedWidth;
myReader.FieldWidths = SecondFormat;
CurrentRow = myReader.ReadFields();
this.DataGridView2.Rows.Add(CurrentRow);
break;
case "SP":
myReader.TextFieldType = FieldType.Delimited;
myReader.Delimiters = ThirdFormat;
CurrentRow = myReader.ReadFields();
this.DataGridView3.Rows.Add(CurrentRow);
break;
}
}
catch (MalformedLineException ex)
{
MessageBox.Show("行 " + ex.Message + " 無效,略過。");
}
}
// 三個 Grid 依第一欄遞增排序
DataGridView1.Sort(DataGridView1.Columns[0], ListSortDirection.Ascending);
DataGridView2.Sort(DataGridView2.Columns[0], ListSortDirection.Ascending);
DataGridView3.Sort(DataGridView3.Columns[0], ListSortDirection.Ascending);
}
}
關鍵技術點
- PeekChars(2):僅讀取前 2 字元判斷格式,**不移動讀取位置**
- TextFieldType:切換
FixedWidth / Delimited 模式
- FieldWidths / Delimiters:依格式設定欄位寬度或分隔字元
- ReadFields():解析當前行回傳字串陣列
- MalformedLineException:捕捉格式錯誤行,略過繼續
- 需引用
Microsoft.VisualBasic.dll 並 using Microsoft.VisualBasic.Devices;